这是一组最小的脚本,用于在用于外部消耗的各种系统的容器中运行模拟器。这些脚本与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应用程序