blob: 70dd8efd263e89a09978684c8b8e94a88c34df46 [file] [log] [blame] [view]
# Container scripts for external releases
This is a set of minimal scripts to run the emulator in a container for various
systems such as Docker, for external consumption. Acloud is not used; only the
emulator and system image zip files are needed.
We do similar things as the internal facing scripts, but is meant for external
release. When the container images are built, they can be separately pushed to
some location such as docker hub or even dl.google.com.
# Docker
We have two scripts that work together to provide emulator docker images:
emu_docker.py
emu_download_menu.py
`emu_docker.py` sets up a Docker image source directory with a Dockerfile that is buildable and runnable as a Docker image, given a Linux emulator zip file, a system image zip file, and a docker repo name (currently unused; any name will do).
`emu_download_menu.py` lists a set of publically available Android Emulator system images and emulators along with their URLs, which makes it easier to download zip files for user with `emu_docker.py`.
## Obtaining URLs for emulator/system image zip files
Issuing:
python emu_download_menu.py
will query the currently published Android SDK and output URLs for the zip files of:
- Available and currently Docker-compatible system images
- Currently published and advertised emulator binaries
For each system image, the API level, variant, ABI, and URL are displayed. For
each emulator, the update channel (stable vs canary), version, host os, and URL
are displayed.
Example output:
SYSIMG android 21 L x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-21_r05.zip
SYSIMG android 22 L x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-22_r06.zip
SYSIMG android 23 M x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-23_r10.zip
SYSIMG android 24 N x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-24_r08.zip
SYSIMG android 25 N x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-25_r01.zip
SYSIMG android 26 O x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-26_r01.zip
SYSIMG android 27 O x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-27_r01.zip
SYSIMG android 28 P x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-28_r04.zip
SYSIMG android 28 Q x86_64 https://dl.google.com/android/repository/sys-img/android/x86_64-Q_r04.zip
SYSIMG google_apis 21 L x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-21_r30.zip
SYSIMG google_apis 22 L x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-22_r24.zip
SYSIMG google_apis 23 M x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-23_r31.zip
SYSIMG google_apis 24 N x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-24_r25.zip
SYSIMG google_apis 25 N x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-25_r16.zip
SYSIMG google_apis 26 O x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-26_r13.zip
SYSIMG google_apis 28 P x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-28_r09.zip
SYSIMG google_apis 28 Q x86_64 https://dl.google.com/android/repository/sys-img/google_apis/x86_64-Q_r04.zip
SYSIMG google_apis_playstore 28 P x86_64 https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86_64-28_r08.p
SYSIMG google_apis_playstore 28 Q x86_64 https://dl.google.com/android/repository/sys-img/google_apis_playstore/x86_64-Q_r04.zp
EMU stable 29.0.11 windows https://dl.google.com/android/repository/emulator-windows-5598178.zip
EMU stable 29.0.11 macosx https://dl.google.com/android/repository/emulator-darwin-5598178.zip
EMU stable 29.0.11 linux https://dl.google.com/android/repository/emulator-linux-5598178.zip
EMU stable 28.0.25 windows https://dl.google.com/android/repository/emulator-windows-5395263.zip
EMU canary 29.0.12 windows https://dl.google.com/android/repository/emulator-windows-5613046.zip
EMU canary 29.0.12 macosx https://dl.google.com/android/repository/emulator-darwin-5613046.zip
EMU canary 29.0.12 linux https://dl.google.com/android/repository/emulator-linux-5613046.zip
One can then use tools like `wget` or a browser to download a desired emulator
and system image. After the two are obtained, we can build a Docker image.
## Building the Docker image: Setting up the source dir
Given an emulator zip file and a system image zip file, we can build a
directory that can be sent to `docker build` via the following invocation of
`emu_docker.py`:
python emu_docker.py <emulator-zip> <system-image-zip> <docker-repo-name(unused currently)> [docker-src-dir (getcwd()/src by default)]
This places all the right elements to run a docker image, but does not build,
run or publish yet. A Linux emulator zip file must be used.
To build the Docker image corresponding to these emulators and system images:
docker build <docker-src-dir, either ./src or specified argument to emu_docker.py>
A Docker image ID will output; save this image ID.
## Running the Docker image
We currently assume that KVM will be used with docker in order to provide CPU
virtualization capabilties to the resulting Docker image.
We provide the following run script:
./run.sh <docker-image-id>
It does the following:
docker run -e "ADBKEY=$(cat ~/.android/adbkey)" --privileged --publish 5556:5556/tcp --publish 5555:5555/tcp <docker-image-id>
- Sets up the ADB key, assuming one exists at ~/.android/adbkey
- Uses `--privileged` to have CPU acceleration
- Starts the emulator in the docker image with its gRPC service, forwarding the host ports 5556/5554 to container ports 5554/5554 respectively.
- The gRPC service is used to communicate with the running emulator inside the container.
## Communicating with the emulator in the container
## adb
We forward the port 5555 for adb access to the emulator running inside the
container (TODO: make this configurable per container).
To enable ADB access, run the following adb command, assuming no other emulators/devices connected:
adb connect localhost:5555
## gRPC/webrtc
We use a gRPC/webrtc service to show what is on the emulator and to interact
with it. This assumes that you have npm/node plus protoc 3.6+ installed and
available, and that no other node servers are running on your machine.
Checkout the emulator repo dir:
https://android.googlesource.com/platform/external/qemu/+/refs/heads/emu-master-dev/android/android-grpc/docs/grpc-samples/js/
In the `/js` dir, issue:
make deps # Uses npm and protoc 3.6+ libraries to build the client
make develop # Runs the service
and point your web browser to localhost:3000.
To stop, hit Ctrl-C in the terminal where `make develop` was issued, then issue:
make stop
TODO: We are also working on a more isolated solution via envoy, nginx, and `docker-compose`. See https://android.googlesource.com/platform/external/qemu/+/refs/heads/emu-master-dev/android/android-grpc/docs/grpc-samples/js/docker/