Dies ist eine Reihe von minimalen Skripten, um den Emulator in einem Container für verschiedene Systeme wie Docker für den externen Verbrauch auszuführen. Die Skripte sind sowohl mit Python Version 2 als auch 3 kompatibel.
*Beachten Sie, dass dies noch eine experimentelle Funktion ist und wir empfehlen, dieses Tool in einer virtuellen Python -Umgebung zu installieren. Bitte stellen Sie Probleme ein, wenn Sie feststellen, dass etwas nicht wie erwartet funktioniert.
Diese Demos sollen auf einem Linux -Betriebssystem ausgeführt werden. Ihr System muss die folgenden Anforderungen erfüllen:
Ein Python-Dolmetscher muss installiert werden (Python3 mit Python3-venv, um virtuelle Umgebungen zu erstellen)
ADB muss auf dem Pfad verfügbar sein. ADB kommt als Teil des Android SDK. Beachten Sie, dass die Installation der Befehlszeilenwerkzeuge ausreichend ist.
Docker muss installiert werden. Stellen Sie sicher, dass Sie es als Nicht-Root-Benutzer ausführen können
Docker-Compose muss installiert werden.
KVM muss verfügbar sein. Sie können Zugang zu KVM erhalten, indem Sie auf "Bare Metal" oder auf einer (virtuellen) Maschine ausgeführt werden, die eine verschachtelte Virtualisierung bietet. Wenn Sie vorhaben, dies in der Cloud (GCE/Azure/AWS/etc ..) auszuführen, müssen Sie zunächst sicherstellen, dass Sie Zugriff auf KVM haben. Details zum Zugriff auf KVM auf den verschiedenen Cloud -Anbietern finden Sie hier:
Denken Sie daran, dass Sie eine verringerte Leistung sehen, wenn Sie eine verschachtelte Virtualisierung verwenden. Die Container wurden unter Debian und Ubuntu Running Kernel 5.2.17 getestet.
Hinweis: Die Bilder werden nicht in Docker auf Mac oder Windows ausgeführt
Wir veranstalten jetzt eine Reihe von Containern in einem öffentlichen Repository. Hier finden Sie Details zu den Containern. Sie können diese Behälter jetzt betreiben, ohne sie zu bauen. Zum Beispiel:
docker run
-e ADBKEY= " $( cat ~ /.android/adbkey ) "
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp
us-docker.pkg.dev/android-emulator-268719/images/30-google-x64:30.1.2
Dadurch wird der Behälter heruntergezogen, wenn er nicht lokal verfügbar ist, und startet ihn. Sie können sehen, dass das beginnt:
Danach können Sie eine Verbindung zum Gerät herstellen, indem Sie ADB konfigurieren:
adb connect localhost:5555
Das Gerät sollte nun nach einer Weile als:
$ adb devices
List of devices attached
localhost:5555 device
Wenn Sie dies in einem Skript verwenden möchten, können Sie Folgendes tun:
docker run -d
-e ADBKEY= " $( cat ~ /.android/adbkey ) "
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp
us-docker.pkg.dev/android-emulator-268719/images/30-google-x64:30.1.2
adb connect localhost:5555
adb wait-for-device
# The device is now booting, or close to be booted
Ein detaillierteres Skript finden Sie in Run-in-script-example.sh.
Sie können das Python -Paket wie folgt installieren:
source ./configure.sh
Dies aktiviert eine virtuelle Umgebung und macht den ausführbaren emu-docker
zur Verfügung. Sie können detaillierte Informationen über die Nutzung erhalten, indem Sie sie wie folgt starten:
emu-docker -h
Sie müssen die Lizenzvereinbarungen akzeptieren, bevor Sie Docker -Container erstellen können.
Sie können interaktiv auswählen, welche Version von Android und Emulator Sie verwenden möchten, indem Sie ausführen:
emu-docker interactive --start
Sie werden gebeten, ein Systembild und eine Emulatorversion auszuwählen, wonach eine Docker -Datei erstellt wird. Das Systembild und der Emulator werden bei Bedarf in das aktuelle Verzeichnis heruntergeladen. Das Skript bietet Ihnen einen Befehl, um die Protokolle sowie den Befehl zu sehen, um den Container zu stoppen.
Wenn der lokale ADB -Server den gestarteten Container automatisch erkannt hat, haben Sie nichts zu tun, um ihn über ADB abzufragen. Wenn dies nicht der Fall ist, können Sie jetzt mit ADB eine Verbindung zum laufenden Gerät herstellen:
adb connect localhost:5555
Um zu überprüfen, ob ADB den Container gesehen hat, können Sie das:
adb devices
Befehl und prüfen Sie, ob ein Gerät erkannt wird.
Vergessen Sie nicht, den Docker -Container zu stoppen, sobald Sie fertig sind!
Lesen Sie den Abschnitt zum verfügbaren Emulator im Internet, um den Emulator mit WebRTC auszuführen
Ausgabe:
emu-docker list
Erfragt die derzeit veröffentlichten Android SDK und Ausgabe -URLs für die Zip -Dateien von:
Für jedes Systembild werden die API -Ebene, Variante, ABI und URL angezeigt. Für jeden Emulator werden der Aktualisierungskanal (stabiler VS -Kanarien), die Version, das Host -Betriebssystem und die URL angezeigt.
Beispielausgabe:
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
Man kann dann Tools wie wget
oder einen Browser verwenden, um ein gewünschtes Emulator und ein Systembild herunterzuladen. Nachdem die beiden erhalten wurden, können wir ein Docker -Bild erstellen.
Bei einer Emulator-Zip-Datei und einer Systembild-Zip-Datei können wir ein Verzeichnis erstellen, das über den folgenden Aufruf von emu-docker
an docker build
gesendet werden kann:
emu-docker create <emulator-zip> <system-image-zip> [--dest docker-src-dir
(getcwd()/src by default)]
Dadurch werden die richtigen Elemente eingerichtet, um ein Docker -Image auszuführen, erstellt, wird jedoch noch nicht ausgeführt oder veröffentlichen. Eine Linux -Emulator -Zip -Datei muss verwendet werden.
So erstellen Sie das Docker -Bild, das diesen Emulatoren und Systembildern entspricht:
docker build <docker-src-dir, either ./src or specified argument to
emu_docker.py>
Eine Docker -Bild -ID wird ausgegeben. Speichern Sie diese Bild -ID.
Wir gehen derzeit davon aus, dass KVM mit Docker verwendet wird, um dem resultierenden Docker -Bild CPU -Virtualisierungsfunktionen bereitzustellen.
Wir bieten das folgende Run -Skript:
./run.sh <docker-image-id> <additional-emulator-params>
Es macht Folgendes:
docker run -e ADBKEY="$(cat ~/.android/adbkey)"
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp <docker-image-id>
--device /dev/kvm
um eine CPU -Beschleunigung zu erhaltenHINWEIS: Sie können einen öffentlichen Adbkey verwenden, indem Sie die Variable adbkey_pub injizieren, d. IE: -E adbkey_pub = "$ (cat ~/.android/adbkey.pub)"
Sie haben auch die Möglichkeit, eine A /Data -Partition zu montieren, die der Emulator verwendet wird, falls dies verfügbar ist. Auf diese Weise können Sie ein TMPFS verwenden, das eine erhöhte Leistung verleihen kann, insbesondere im verschachtelten Virtualisierungsszenario.
Zum Beispiel:
docker run -e ADBKEY="$(cat ~/.android/adbkey)"
--device /dev/kvm
--mount type=tmpfs,destination=/data
--publish 8554:8554/tcp
--publish 5555:5555/tcp <docker-image-id>
Derzeit unterstützen wir die Hardware -Beschleunigung für NVIDIA. Um die Hardwarebeschleunigung zu nutzen, müssen Sie möglicherweise die NVIDIA -Docker -Erweiterungen von hier aus installieren, wenn Sie eine ältere Version von Docker ausführen (<19.03). Sie müssen sicherstellen, dass Sie eine minimale X -Installation haben, wenn Sie eine Cloud -Instanz verwenden. Zum Beispiel kann XVFB verwendet werden. Sie müssen die Container bauen, indem Sie die Flag -GPU -Flagge geben:
emu-docker create stable Q --gpu
Sie können den Emulator jetzt mit dem run-with-gpu.sh
-Skript starten:
./run-with-gpu.sh <docker-image-id> <additional-emulator-params>
Das Skript ist ähnlich wie das oben beschrieben mit dem Zugabe, dass es:
--gpu all
)Die Hardwarebeschleunigung verbessert die Leistung von Anwendungen erheblich, die stark auf Grafiken beruhen. Beachten Sie, dass, obwohl wir einen X11 -Server für die GPU -Beschleunigung benötigen, keine Benutzeroberfläche angezeigt wird.
Sie können die erstellten Bilder in ein Repository drücken, indem Sie die Parameter -Push und -Repo und -Tag bereitstellen, wenn Sie ein Bild erstellen. Der Parameter -Tag ist optional und wird verwendet, um die Version des erstellten Bildes anzuzeigen. Dies wird standardmäßig zum Build-ID des Emulators sind, da Systembilder selten aktualisiert werden.
Wir haben das folgende Namensschema für Bilder übernommen:
{api}-{sort}-{abi}
Wo:
Zum Beispiel: 29-PlayStore-X86: 30.1.2 zeigt ein von PlayStore-fähiges Systembild mit Q an, das auf 32-Bit-X86 ausgeführt wird.
Ein Beispielaufruf für die Veröffentlichung aller Q -Bilder an Google Cloud Repo könnte sein:
emu-docker -v create --push --repo us.gcr.io/emulator-project/ stable " Q "
Bilder, die in ein Repository gedrückt wurden, können direkt aus dem Repository gestartet werden. Zum Beispiel:
docker run --device /dev/kvm --publish 8554:8554/tcp --publish 5555:5555/tcp
us.gcr.io/emulator-project/29-playstore-x86:30.1.2
Wir leiten den Port 5555 für den ADB -Zugriff auf den im Container ausgeführten Emulator weiter. ADB erkennt das Gerät möglicherweise nicht automatisch. Führen Sie also aus:
adb connect localhost:5555
Ihr Gerät sollte jetzt als:
$ adb devices
List of devices attached:
localhost:5555 device
Dieses Repository enthält auch ein Beispiel, das zeigt, wie Sie Docker verwenden können, um den Emulator über das Web zugänglich zu machen. Dies geschieht durch das Verfassen der folgenden Docker -Container:
Um dieses Beispiel auszuführen und mit dem Emulator interagieren zu können, müssen Sie Folgendes berücksichtigen:
Sie benötigen Docker-Compose.
Sie müssen Port 80 und 443 zur Verfügung haben. Die Docker -Container erstellen ein internes Netzwerk und enthüllen die HTTP- und HTTPS -Ports.
Sie müssen ein Emulator -Docker -Bild erstellen, wie in der obigen Dokumentation beschrieben.
Abhängig von Ihrem Netzwerk benötigen Sie möglicherweise Wende
Wir verwenden derzeit Firebase, um Authentifizierung und Autorisierung zu behandeln. Sie müssen eine JSON -Konfiguration des Projekts bereitstellen, das Sie verwenden möchten. Sie können das hier bereitgestellte Beispiel verwenden, aber es funktioniert nur bei Localhost. Sie können die FireBase -Konfiguration von der Konsole abrufen. Platzieren Sie die Firebase JOSN -Konfiguration hier:
./js/firebase_config.json
Dies wird verwendet, um die Konfigurations- und Gesandtereinstellungen zu generieren.
Um die Webcontainer zu erstellen, müssen Sie die folgenden Tools zur Verfügung haben:
Als nächstes müssen Sie einen Container mit der Emulator & System -Bildversion erstellen, die Sie verwenden möchten. Zum Beispiel:
. ./configure.sh && emu-docker create canary "P.*x86_64"
Sobald Sie die obigen Schritte erledigt haben, können Sie die Container mit dem Skript create_web_container.sh
erstellen:
$ ./create_web_container.sh -h
usage: create_web_container.sh [-h] [-a] [-s] [-i] -p user1,pass1,user2,pass2,...
optional arguments:
-h show this help message and exit.
-a expose adb. Requires ~ /.android/adbkey.pub to be available at run.
-s start the container after creation.
-i install systemd service, with definition in /opt/emulator
Zum Beispiel:
./create_web_container.sh
Dies wird Folgendes tun:
Sie können jetzt den Container wie folgt starten:
docker-compose -f js/docker/docker-compose.yaml up
Wenn Sie ADB zur Verfügung stellen möchten, können Sie das Overlay in JS/Docker/Development anwenden. Yaml wie folgt:
docker-compose -f js/docker/docker-compose.yaml -f js/docker/development.yaml up
Zeigen Sie Ihren Browser auf Localhost. Sie werden wahrscheinlich aufgrund der Verwendung des selbst unterschriebenen Zertifikats eine Warnung erhalten. Sobald Sie das Zertifikat akzeptieren, sollten Sie sich anmelden und mit dem Emulator beginnen.
Beachten Sie die folgenden Dinge, wenn Sie den Emulator über ADB zugänglich machen:
~/.android/adbkey
. Dies ist der private Schlüssel, der von ADB verwendet wird. Ohne dies können Sie nicht über ADB auf das Gerät zugreifen.adb connect ip-address-of-container:5555
bevor Sie mit dem Gerät interagieren können. Zum Beispiel: $ adb connect localhost:5555
$ adb shell getprop
Es gibt ein Beispiel-Cloud-Init-Skript, das Details darüber enthält, wie Sie eine Instanz konfigurieren können, mit der automatisch ein Emulator für die Erstellung gestartet und konfiguriert wird. Details dazu finden Sie hier.
Wir haben ein separates Dokument im Zusammenhang mit Problemen.
Details zum Design und zur Änderung der React -Anwendung finden Sie hier