這是一組最小的腳本,用於在用於外部消耗的各種系統的容器中運行模擬器。這些腳本與Python版本2和3均兼容。
*請注意,這仍然是一個實驗功能,我們建議在Python虛擬環境中安裝此工具。如果您注意到任何事情都無法正常工作,請提交問題。
這些演示旨在在Linux OS上運行。您的系統必須滿足以下要求:
必須安裝Python解釋器(帶有Python3-Venv的Python3來創建虛擬環境)
ADB必須在路徑上可用。 ADB是TH Android SDK的一部分。請注意,安裝命令行工具就足夠了。
必須安裝Docker。確保您可以作為非root用戶運行
必須安裝Docker-Compose。
KVM必須可用。您可以通過在“裸金屬”或提供嵌套虛擬化的(虛擬)機上運行來訪問KVM。如果您打算在雲中運行此操作(GCE/Azure/AWS/等。),則首先必須確保您可以訪問KVM。有關如何在各種雲提供商上訪問KVM的詳細信息,請參見此處:
請記住,如果您使用嵌套虛擬化,則會看到降低性能。這些容器已在Debian和Ubuntu運行內核5.2.17下進行了測試。
注意:這些圖像不會在Mac或Windows上的Docker中運行
現在,我們在公共存儲庫中託管一組容器。您可以在此處找到有關容器的詳細信息。現在,您可以在不構建這些容器的情況下運行這些容器。例如:
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
如果該容器不可本地可用並啟動它,則將其拉下。您可以看到這是開始的:
之後,您可以通過配置ADB來連接到設備:
adb connect localhost:5555
現在,該設備應在一段時間後出現:
$ adb devices
List of devices attached
localhost:5555 device
如果您想在腳本中使用此信息,則可以執行以下操作:
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
可以在run-script-example.sh中找到一個更詳細的腳本。
您可以按照以下方式安裝Python軟件包:
source ./configure.sh
這將激活虛擬環境,並使可執行的emu-docker
可用。您可以通過啟動以下內容來獲取有關使用情況的詳細信息:
emu-docker -h
在創建Docker容器之前,您將必須接受許可協議。
您可以交互方式選擇您希望通過運行使用的Android和模擬器的版本:
emu-docker interactive --start
您將被要求選擇系統映像和模擬器版本,然後將創建Docker文件。如果需要,系統映像和仿真器將下載到當前目錄。腳本將為您提供命令,以查看日誌以及停止容器的命令。
如果本地ADB服務器自動檢測到啟動容器,則無需通過ADB查詢它。如果不是這種情況,您現在可以使用ADB連接到運行設備:
adb connect localhost:5555
要檢查ADB是否看到了容器,您可以使用:
adb devices
命令並檢查是否檢測到設備。
完成後,請不要忘記停止Docker容器!
閱讀有關使模擬器在網絡上可用的部分以使用WEBRTC運行模擬器
發行:
emu-docker list
將查詢當前發布的Android SDK和輸出URL的ZIP文件:
對於每個系統圖像,顯示API級別,變體,ABI和URL。對於每個模擬器,顯示更新頻道(穩定的VS金絲雀),版本,主機OS和URL。
示例輸出:
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
然後,可以使用wget
或瀏覽器之類的工具下載所需的模擬器和系統映像。獲得兩者後,我們可以構建一個docker映像。
給定模擬器zip文件和一個系統映像zip文件,我們可以構建一個可以通過以下emu-docker
的調用發送到docker build
目錄:
emu-docker create <emulator-zip> <system-image-zip> [--dest docker-src-dir
(getcwd()/src by default)]
這將所有正確的元素放置以運行Docker映像,但尚未構建,運行或發布。必須使用Linux模擬器ZIP文件。
構建與這些模擬器和系統圖像相對應的Docker圖像:
docker build <docker-src-dir, either ./src or specified argument to
emu_docker.py>
Docker Image ID將輸出;保存此圖像ID。
目前,我們假設KVM將與Docker一起使用,以便為最終的Docker映像提供CPU虛擬化功能。
我們提供以下運行腳本:
./run.sh <docker-image-id> <additional-emulator-params>
它執行以下操作:
docker run -e ADBKEY="$(cat ~/.android/adbkey)"
--device /dev/kvm
--publish 8554:8554/tcp
--publish 5555:5555/tcp <docker-image-id>
--device /dev/kvm
具有CPU加速度注意:您可以通過注入adbkey_pub變量,即:-e adbkey_pub =“ $(cat〜/.android/adbkey.pub)”來使用公共adbkey“
您還可以選擇安裝A /數據分區,如果可用,則模擬器將使用該分區。這使您可以使用可以提高性能的TMPF,尤其是在嵌套虛擬化方案中。
例如:
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>
我們目前僅支持NVIDIA的硬件加速度。為了使用硬件加速度,如果您運行了舊版本的Docker(<19.03),則可能必須從這里安裝NVIDIA Docker擴展程序。如果您使用的是雲實例,則必須確保您的X安裝最小。例如可以使用XVFB。您必須通過傳遞-GPU標誌來構建容器:
emu-docker create stable Q --gpu
現在,您可以使用run-with-gpu.sh
腳本啟動模擬器:
./run-with-gpu.sh <docker-image-id> <additional-emulator-params>
該腳本與上面描述的腳本相似,並以下腳本:
--gpu all
)硬件加速度將顯著提高嚴重依賴圖形的應用程序的性能。請注意,即使我們需要X11服務器進行GPU加速度,也不會顯示UI。
您可以通過在創建圖像時提供-push和-push和-tag參數來將創建的圖像推向存儲庫。 -TAG參數是可選的,用於指示創建圖像的版本。由於系統映像很少更新,這將默認為模擬器的構建ID。
我們為圖像採用了以下命名方案:
{api} - {stort} - {abi}
在哪裡:
例如: 29-PlayStore-X86:30.1.2指示啟用PlayStore的系統圖像,Q在32位X86上運行。
向Google Cloud Repo發布所有Q圖像的示例調用可能是:
emu-docker -v create --push --repo us.gcr.io/emulator-project/ stable " Q "
已將其推向存儲庫的圖像可以直接從存儲庫啟動。例如:
docker run --device /dev/kvm --publish 8554:8554/tcp --publish 5555:5555/tcp
us.gcr.io/emulator-project/29-playstore-x86:30.1.2
我們將端口5555轉發,以供ADB訪問容器內部運行的模擬器。 ADB可能無法自動檢測到設備,因此運行:
adb connect localhost:5555
現在,您的設備應顯示為:
$ adb devices
List of devices attached:
localhost:5555 device
該存儲庫還包含一個示例,該示例演示瞭如何使用Docker使模擬器通過Web訪問。這是通過組成以下Docker容器的組合來完成的:
為了運行此樣本並能夠與模擬器進行交互,您必須牢記以下內容:
您將需要Docker-Compose。
您必須有80和443端口。 Docker容器將創建一個內部網絡,並公開HTTP和HTTPS端口。
如上所述,您將需要創建一個模擬碼頭圖像。
根據您的網絡,您可能需要轉彎
我們目前正在使用Firebase處理身份驗證和授權。您將需要提供您希望使用的項目的JSON配置。您可以使用此處提供的示例,但它僅適用於Localhost。您可以從控制台放置Firebase JOSN配置在此處獲取firebase配置:
./js/firebase_config.json
這將用於生成配置和特使設置。
為了創建Web容器,您必須擁有以下工具可用:
接下來,您必須使用要使用的模擬器和系統圖像版本創建一個容器。例如:
. ./configure.sh && emu-docker create canary "P.*x86_64"
一旦完成了上述步驟,您就可以使用create_web_container.sh
腳本創建容器:
$ ./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
例如:
./create_web_container.sh
這將執行以下操作:
您現在可以按以下方式啟動容器:
docker-compose -f js/docker/docker-compose.yaml up
如果您想讓ADB可用,則可以應用JS/Docker/Development中的覆蓋層。
docker-compose -f js/docker/docker-compose.yaml -f js/docker/development.yaml up
將您的瀏覽器指向Localhost。由於使用自簽名證書,您可能會受到警告。接受證書後,您應該能夠登錄並開始使用仿真器。
通過ADB訪問模擬器時,請記住以下內容:
~/.android/adbkey
。這是ADB使用的私鑰。沒有此,您將無法通過ADB訪問設備。adb connect ip-address-of-container:5555
在與設備進行交互之前。例如: $ adb connect localhost:5555
$ adb shell getprop
有一個示例雲腳本,可提供有關如何配置將自動啟動和配置模擬器創建的實例的詳細信息。有關如何執行此操作的詳細信息可以在此處找到。
我們有一個與處理問題有關的單獨文件。
可以在此處找到有關設計的詳細信息以及如何修改React應用程序