模拟器脚本 持续集成环境下的 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}"