共计 3069 个字符,预计需要花费 8 分钟才能阅读完成。
实现在继续集成环境中为您的利用运行测试的能力,是确保产品质量的重要一步。然而,通过创立镜像来为继续集成计算机从新创立稳固的环境是一个颇具挑战性的工作。作为应答挑战的第一步,您能够应用预构建容器或脚本为 Linux 创立 Docker 镜像。在本文中,我将会向您论述如何应用预构建容器,以及脚本都做了哪些工作。
Android 模拟器的 Docker 预构建
当初,借助咱们提供的预构建 Android 模拟器容器,在继续集成 (CI) 或者继续部署 (CD) 环境中设置和运行 Android 模拟器变得较以往轻松了许多。这些容器能够帮您在运行正确版本的模拟器的同时,避免出现令人头疼的依赖治理问题;同时也能帮您轻易地将自动测试整合为 CI 或 CD 零碎的一部分,从而罢黜物理设施农场所需的开销。
之前,咱们公布了一篇博客: Android 模拟器的下载与 Docker 镜像生成脚本 来帮忙开发者简化近程模拟器的部署与调试。这些脚本能够简化寻找正确零碎镜像、管理系统依赖的以及运行 Android 模拟器的过程。
当初,咱们正更进一步,在为模拟器的每个次要公布版本都提供预构建的 Android 模拟器容器。这些容器无需运行生成脚本,从而节约了工夫,并升高了复杂度。预构建容器还反对 Docker 脚本所提供的所有性能,如 adb 与 web 拜访。
Linux KVM 是运行这些容器的必要条件,您能够在裸机或者具备嵌套虚拟化环境的虚拟机中启用这一性能。至于哪一种计划更好取决于您的云服务提供商,您能够查看此 文档 来获取举荐列表。
上面的脚本展现了如何集成 Android 模拟器容器到您的零碎,以及如何应用它们运行测试:
#!/bin/bash
# 这是咱们将要运行的近程镜像。# 如果需要的话,Docker 会为咱们获取它。DOCKER_IMAGE=us-docker.pkg.dev/android-emulator-268719/images/r-google-x64:30.0.23
# 这是转发端口。端口号较大是为了防止
# 影响 adb 扫描模拟器的能力。PORT=15555
# 这段会在后盾启动容器。container_id=$(docker run -d \
-e "ADBKEY=$(cat ~/.android/adbkey)" --device /dev/kvm --publish \
8554:8554/tcp --publish $PORT:5555/tcp \
$DOCKER_IMAGE)
echo "The container is running with id: $container_id"
# 留神您可能看到像上面这样的信息:# 连贯 localhost:15555 失败
# 这仅仅是示意容器尚未准备就绪。echo "Connecting to forwarded adb port."
adb connect localhost:$PORT
# 咱们基本上必须期待 `docker ps` 向咱们展现衰弱度。# 因为模拟器的启动须要工夫,所以这一过程可能要稍等一会儿。echo "Waiting until the device is ready"
adb wait-for-device
# 设施当初曾经启动,或将要被启动。# 咱们只须要等到 sys.boot_completed 属性被设置为 1 即可。while ["`adb shell getprop sys.boot_completed | tr -d'\r'`" != "1"] ;
do
echo "Still waiting for boot.."
sleep 1;
done
# 当初您能够像平时一样应用模拟器了,例如:# ./gradlew installDebug
# ./gradlew connectedAndroidTest
# 等等
echo "The device is ready"
echo "Run the following command to stop the container:"
echo "docker stop ${container_id}"
您能够浏览 README 来进一步获取无关入门和利用 Android 模拟器容器的信息。这是咱们第一次提供预构建模拟器容器,若有任何应用上的问题或性能上的需要,请在 issue tracker 上向咱们反馈。
容器脚本细节
Github 仓库 google/android-emulator-container-scripts 中蕴含了咱们 Docker 平台上的 Android 模拟器计划的外部工作原理。这个脚本目前仅实用于 Linux,而且须要可能拜访 KVM 的管理员权限。它是一组蕴含下列应用 emu-docker 命令性能的最小脚本:
emu-docker list
: 查问已公布的兼容 Docker 的零碎镜像,以及模拟器引擎的二进制文件,并显示它们的下载链接。这里提供了一个动静生成的、蕴含所有处于稳固和 Canary 版本的已公布零碎镜像和模拟器的列表,此列表应用的数据与 SDK 管理器中形容模拟器和零碎映像版本的数据雷同,因而该列表始终是最新的;
*[emu-docker create <emulator-zip> <systemimage-zip> — dest docker-src-dir(getcwd()/src by default)
: 为特定的零碎镜像和模拟器创立自定义本地 Docker 镜像;docker run -e ADBKEY=”$(cat ~/.android/adbkey)”— device /dev/kvm — publish 8554:8554/tcp — publish 5555:5555/tcp <docker-image-id>
: 应用端口 8854 (用于 gRPC) 与 5555 (用于 ADB 通信) 启动与 <docker-image-id> 相干的模拟器和零碎镜像 (能够应用adb connect localhost:5555
启用 ADB 拜访 );emu-docker interactive — start
: 交互式提醒,其中列出了无关获取 Docker 镜像列表以及下载、创立、启动 Docker 镜像的步骤。
与 Docker 实例交互
在您创立和启动 Docker 实例之后,能够应用两种形式与其进行交互: 应用 ADB 或者通过 WebRTC 进行基于近程数据流的交互。上面是这些形式的详细描述:
ADB
应用 ADB 能够让 logcat 与 shell 可能拜访残缺的 ADB 命令,您只须要 adb connect localhost:5555 即可 (如有须要,能够把 5555 替换为须要的 ADB 端口)。
通过 WebRTC 进行基于近程数据流的交互
咱们提供了一套蕴含 Envoy、Nginx、Token Service 和模拟器容器的 docker-compose 配置,以暴露出 WebRTC/gRPC 端口用于同模拟器进行交互。在创立了模拟器容器,执行完步骤之后,蕴含 create_web_container.sh
的脚本会在本地捕捉创立容器和生成加密传输用的密钥的过程。在创立 web 容器之后,docker-compose -f js/docker/docker-compose.yaml
up 或 docker-compose -f js/docker/docker-compose.yaml -f js/docker/development.yaml
up (用于同时进行 ADB 拜访) 可用于启动和协调所有内容。默认状况下,这些操作会在本地计算机的 80 端口上裸露可交互的模拟器,所以实践上应用浏览器指向 localhost 应该就能够与模拟器进行交互了。
请通过 Github issue tracker 向咱们反馈问题。您可能还会对 应用新的 Android 模仿工具进行继续测试 这一内容感兴趣,这篇文章提供了更多相干的背景常识。