模拟器脚本 持续集成环境下的 Android 模拟器
实现在持续集成环境中为您的应用运行测试的能力,是确保产品质量的重要一步。然而,通过创建镜像来为持续集成计算机重新创建稳定的环境是一个颇具挑战性的任务。作为应对挑战的第一步,您可以使用预构建容器或脚本为 Linux 创建 Docker 镜像。在本文中,我将会向您阐述如何使用预构建容器,以及脚本都做了哪些工作。
Android 模拟器的 Docker 预构建
现在辅助论坛,借助我们提供的预构建 Android 模拟器容器,在持续集成 (CI) 或者持续部署 (CD) 环境中设置和运行 Android 模拟器变得较以往轻松了许多。这些容器可以帮您在运行正确版本的模拟器的同时,避免出现令人头疼的依赖管理问题;同时也能帮您轻易地将自动测试整合为 CI 或 CD 系统的一部分,从而免除物理设备农场所需的开销。
之前模拟器脚本,我们发布了一篇博客:Android 模拟器的下载与 Docker 镜像生成脚本来帮助开发者简化远程模拟器的部署与调试。这些脚本可以简化寻找正确系统镜像、管理系统依赖的以及运行 Android 模拟器的过程。
现在,我们正更进一步,在为模拟器的每个主要发布版本都提供预构建的 Android 模拟器容器。这些容器无需运行生成脚本,从而节约了时间,并降低了复杂度。预构建容器还支持 Docker 脚本所提供的所有功能,如 adb 与 web 访问。
Linux KVM 是运行这些容器的必要条件,您可以在裸机或者具有嵌套虚拟化环境的虚拟机中启用这一功能。至于哪一种方案更好取决于您的云服务提供商,您可以查看此文档来获取推荐列表。
下面的脚本展示了如何集成 Android 模拟器容器到您的系统,以及如何使用它们运行测试:
# 这是我们将要运行的远程镜像。
# 如果需要的话,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 命令功能的最小脚本:
与 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.yamlup 或 docker-compose -f js/docker/docker-compose.yaml -f js/docker/development.yamlup (用于同时进行 ADB 访问) 可用于启动和协调所有内容。默认情况下,这些操作会在本地计算机的 80 端口上暴露可交互的模拟器,所以理论上使用浏览器指向 localhost 应该就可以与模拟器进行交互了。
请通过 Github issue tracker 向我们反馈问题。您可能还会对使用新的 Android 模拟工具进行持续测试这一内容感兴趣,这篇文章提供了更多相关的背景知识。
来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!