0

0

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

蓮花仙者

蓮花仙者

发布时间:2025-07-15 10:04:02

|

735人浏览过

|

来源于php中文网

原创

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

Android 模拟器的 Docker 预构建

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

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

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

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

下面的脚本展示了如何集成 Android 模拟器容器到您的系统,以及如何使用它们运行测试:

代码语言:javascript代码运行次数:0运行复制
#!/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 命令功能的最小脚本:

WIKINDX
WIKINDX

参考文献管理、文献管理、引用等等。WIKINDX是由学者为学者设计的,自2003年以来持续开发,并被全球个人和主要研究机构使用的虚拟研究环境(增强型在线文献管理器),可存储可搜索的参考文献、笔记、文件、引用、思想等。集成的所见即所得的文字处理器可将格式化的文章导出为RTF和HTML。插件包括引文样式编辑器和参考文献的导入/导出(BibTeX、Endnote、RIS等)。WIKINDX支持每个参考文献的多个附件,多种语言本地化,并使用模板系统允许用户将WIKINDX视觉集成到他们的网站中。WIKINDX在W

下载
emu-docker list: 查询已发布的兼容 Docker 的系统镜像,以及模拟器引擎的二进制文件,并显示它们的下载链接。这里提供了一个动态生成的、包含所有处于稳定和 Canary 版本的已发布系统镜像和模拟器的列表,此列表使用的数据与 SDK 管理器中描述模拟器和系统映像版本的数据相同,因此该列表始终是最新的;

* [emu-docker create — 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 : 使用端口 8854 (用于 gRPC) 与 5555 (用于 ADB 通讯) 启动与 相关的模拟器和系统镜像 (可以使用 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 应该就可以与模拟器进行交互了。

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

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

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

554

2023.06.20

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

374

2023.07.04

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

731

2023.07.04

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

477

2023.09.01

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

394

2023.09.04

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

991

2023.09.04

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

657

2023.09.12

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

551

2023.09.20

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

23

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 8.7万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.6万人学习

Sass 教程
Sass 教程

共14课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号