查看原文
其他

持续集成环境下的 Android 模拟器

Android Android 开发者 2021-08-05

实现在持续集成环境中为您的应用运行测试的能力,是确保产品质量的重要一步。然而,通过创建镜像来为持续集成计算机重新创建稳定的环境是一个颇具挑战性的任务。作为应对挑战的第一步,您可以使用预构建容器或脚本为 Linux 创建 Docker 镜像。在本文中,我将会向您阐述如何使用预构建容器,以及脚本都做了哪些工作。

 


Android 模拟器的 Docker 预构建




现在,借助我们提供的预构建 Android 模拟器容器,在持续集成 (CI) 或者持续部署 (CD) 环境中设置和运行 Android 模拟器变得较以往轻松了许多。这些容器可以帮您在运行正确版本的模拟器的同时,避免出现令人头疼的依赖管理问题;同时也能帮您轻易地将自动测试整合为 CI 或 CD 系统的一部分,从而免除物理设备农场所需的开销。 

 

之前,我们发布了一篇博客: Android 模拟器的下载与 Docker 镜像生成脚本来帮助开发者简化远程模拟器的部署与调试。这些脚本可以简化寻找正确系统镜像、管理系统依赖的以及运行 Android 模拟器的过程。


  • Android 模拟器的下载与 Docker 镜像生成脚本

    https://android-developers.googleblog.com/2019/10/continuous-testing-with-new-android.html

 

现在,我们正更进一步,在为模拟器的每个主要发布版本都提供预构建的 Android 模拟器容器。这些容器无需运行生成脚本,从而节约了时间,并降低了复杂度。预构建容器还支持 Docker 脚本所提供的所有功能,如 adbweb 访问。 


  • adb
    https://github.com/google/android-emulator-container-scripts#communicating-with-the-emulator-in-the-container
  • web
    https://github.com/google/android-emulator-container-scripts#make-the-emulator-accessible-on-the-web

Linux KVM 是运行这些容器的必要条件,您可以在裸机或者具有嵌套虚拟化环境的虚拟机中启用这一功能。至于哪一种方案更好取决于您的云服务提供商,您可以查看此文档来获取推荐列表。

 

  • 文档
    https://github.com/google/android-emulator-container-scripts/blob/master/REGISTRY.MD#requirements-and-recommendations


下面的脚本展示了如何集成 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 上向我们反馈。


  • README
    https://github.com/google/android-emulator-container-scripts

  • issue tracker
    https://github.com/google/android-emulator-container-scripts/issues



容器脚本细节



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 镜像的步骤。

  • google
    https://github.com/google

  • android-emulator-container-scripts
    https://github.com/google/android-emulator-container-scripts

 


与 Docker 实例交互



在您创建和启动 Docker 实例之后,可以使用两种方式与其进行交互: 使用 ADB 或者通过 WebRTC 进行基于远程数据流的交互。下面是这些方式的详细描述:
 

ADB



使用 ADB 可以让 logcat 与 shell 能够访问完整的 ADB 命令,您只需要 adb connect localhost:5555 即可 (如有需要,可以把 5555 替换为需要的 ADB 端口)。
 
  • ADB
    https://developer.android.google.cn/studio/command-line/adb



通过 WebRTC 进行基于远程数据流的交互



我们提供了一套包含 EnvoyNginxToken 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 应该就可以与模拟器进行交互了。


  • Envoy
    https://www.envoyproxy.io/
  • Nginx
    https://www.nginx.com/
  • Token Service
    https://github.com/google/android-emulator-container-scripts/blob/master/js/jwt-provider/README.md

请通过 Github issue tracker 向我们反馈问题。您可能还会对使用新的 Android 模拟工具进行持续测试这一内容感兴趣,这篇文章提供了更多相关的背景知识。


  • Github issue tracker
    https://github.com/google/android-emulator-container-scripts/issues

  • 使用新的 Android 模拟工具进行持续测试
    https://android-developers.googleblog.com/2019/10/continuous-testing-with-new-android.html



 点击屏末 | 阅读原文 | 即刻在 Android 模拟器上运行应用


推荐阅读

如页面未加载,请刷新重试


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存