Android emulator upstream integration madness
=============================================

After more than 2 years of inactivity, the Android emulator sources are
being refactored to match the level of a much more recent upstream QEMU.

The main goal for this work is to get to reuse Intel, ARM and MIPS 64-bit
emulation support, as well as to clean up some of the cruft accumulated over
the years.

A secondary goal is to make it drastically easier to send patches to QEMU
upstream to support Android use cases, when that makes sense, and if they
are interested.


I. Branches:
------------

All work happens in the open on the public AOSP source/gerrit servers, but
two branches are being used:

  idea133
        This branch is currently used by the Android SDK tools team to
        develop the next release of all SDK tools, emulator included.

        If you have a general fix that is not related to the refactoring
        work, this is where to send your contributions if you want them
        to appear as soon as possible in the next public SDK tools release.

  master
        This branch is used to host a series of several hundred small patches
        needed by the refactoring work. Each patch should try to do one simple
        thing at a time. However, due to the extremely high coupling present in
        the QEMU code base, even changing a couple header lines might impact
        several dozen sources.

        Each patch *must* result in a perfectly buildable emulator for all
        supported host systems, and ideally not break anything when running it.

        Because these patches are so numerous, they are typically uploaded to
        the AOSP server as a batch of 20 or 50, through an explicit merge
        commit. I.e. the batch will appear on Gerrit as a simple change, instead
        of 20-50 individual ones.

        We currently discourage you to submit to this branch on your own, unless
        you've contacted tools@android.com first (we can help rebasing your
        patches on top of the next batch before they happen).

See section III. to see how to checkout and submit to the idea133 branch.

Explicit (manual) merges will happen too:

  - Merging aosp/idea133 into aosp/master will happen frequently, to ensure that
    general fixes go into the refactored codebase.

  - Merging aosp/master into aosp/idea133 will happen more rarely, and after
    significant testing from the team to ensure that doesn't break anything.

For reference, the master branch is currently targetting the upstream QEMU
commit with the following SHA-1:

        47acdd63a33a5966bf4fc94a6ac835d72a70c555

Which may be updated later to integrate more upstream fixes.


II. Scope:
----------

The priority is to get the following components to the level of upstream
as soon as possible:

  - tcg
  - cpu emulation
  - softmmu
  - kvm / haxm
  - virtual devices (goldfish and others).

Other components like block/, net/, ui/, audio/ have lower priority.
Some upstream components like qmp, tracing or migration will not be used.
In case of doubt, contact tools@android.com.

The content of android/ will also be refactored to make it more testable and
less dependant on the QEMU parts of the code, whenever possible. It is expected
that some of this code will be rewritten in C++ too. This is lower priority and
will probably happen in the idea133 branch, instead of the master one.


III. Checking it out and sending patches to idea133:
----------------------------------------------------

If you plan to work on general emulator fixes, without other parts of the
platform, it is highly recommended to checkout the full branch with repo:

  cd android-idea133
  repo init -u https://android.googlesource.com/a/platform/manifest -b idea133
  repo sync

In that case, "repo upload" will send your patches directly from the right
branch when you upload them to gerrit.


If you already have a 'master' checkout of AOSP, you can still work on individual
changes for the branch, but do _not_ use repo to upload them, instead do
something like:

  cd external/qemu
  git checkout -t -b my-fix aosp/idea133

  ... edit files ...
  mm                     # Verify that everything builds.
  emulator_unittests     # Run the unit tests.
  emulator @my-test-avd  # Verify manually that everything runs.

  git add .
  git commit
  git push aosp +HEAD:refs/for/idea133

This will upload the patch to gerrit to the right branch.

Be careful that a "repo sync" will erase all custom branches that are not
tracking master. If this happens use "git reflog" to get your past state
(but not your branches).
