news 2026/9/11 14:18:59

如何用 Docker 运行 Android 模拟器:3 分钟跑通 Docker-Android

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何用 Docker 运行 Android 模拟器:3 分钟跑通 Docker-Android

如何用 Docker 运行 Android 模拟器:3 分钟跑通 Docker-Android

【免费下载链接】docker-androidAndroid in docker solution with noVNC supported, video recording and mcp server项目地址: https://gitcode.com/GitHub_Trending/do/docker-android

CI 机器没有显示界面,或者你不想在每台测试机上逐个安装 SDK、AVD 和各种驱动,Docker-Android 能省掉很多麻烦:它把一个开箱即用的 Android 模拟器打包进 Docker 镜像,支持 Web VNC / VNC 远程查看画面、ADB 外部连接、日志 Web 页面,覆盖 Android 9.0 到 14.0 共 6 个版本。

先搞清楚它解决什么问题

传统 Android 测试有三类反复出现的痛点:一是环境漂移,每台机器手工装 SDK、模拟器和设备配置,版本差异细微,出问题后很难复现;二是无头机器跑不了模拟器,CI 容器或云 VM 通常没有显示界面,标准 AVD 根本无法显示;三是设备版本矩阵太大,跨多个版本、多种机型测试意味着要维护多套本地环境。

Docker-Android 的思路是把模拟器装进镜像:镜像标签与 Android 版本一一对应,从 emulator_9.0 一直到 emulator_14.0,设备配置则在启动时用环境变量选择,覆盖三星 Galaxy S7 Edge / S8 / S9 / S10、Nexus 系列,以及 Nexus 7、Pixel C 等平板。

3 分钟拉起一台容器化模拟器

前置条件:主机装好 Docker 并开启硬件虚拟化(KVM),Ubuntu 可直接使用,macOS / Windows 用户需要先准备一台支持虚拟化的 Ubuntu 虚拟机。验证 KVM 是否可用,安装 cpu-checker 后运行 kvm-ok 即可。

📦 然后一条命令启动:

docker run -d -p 6080:6080 \ -e EMULATOR_DEVICE="Samsung Galaxy S10" \ -e WEB_VNC=true \ --device /dev/kvm \ --name android-container \ budtmo/docker-android:emulator_11.0

启动后在浏览器打开本地 6080 端口就能看到模拟器画面,上面截图正是其中的短信模拟页面。把标签换成 emulator_14.0 或 emulator_9.0 即可切换 Android 版本,其余内容不用动。启动过程中可用容器内的状态文件确认开机进度:

docker exec -it android-container cat device_status

画面与日志:容器里是怎么运转的

模拟器画面走容器内的 VNC 服务(5900 端口),noVNC 让你直接在浏览器里看:WEB_VNC 设为 true 后,6080 端口暴露为 Web UI,URL 还能通过参数限制为只读或加密码保护。只想用 VNC 客户端连接的话,映射 5900 端口并设置 VNC_PASSWORD 即可。

日志同样 Web 化:开启 WEB_LOG 后,日志文件在 Web 页面(默认 9000 端口,可用 WEB_LOG_PORT 调整)中直接查看。控制面上,模拟器保留标准 ADB 端口,外部测试框架或其他 CI 节点可以直接 adb connect 对接,测试代码完全不需要感知模拟器跑在容器里。

典型玩法:Appium、Jenkins 与项目构建

⚙️ 做 UI 自动化最常见的组合是 Appium:开放 4723 端口并设置 APPIUM=true 即可在容器内启动 Appium 服务端,APPIUM_ADDITIONAL_ARGS 可以把参数透传给 Appium 2.x;该容器还能不改项目直接注册到 Selenium Grid 4.x。具体用法见 Appium 用例文档。想接入流水线,Jenkins 用例说明了如何在 CI 任务中管理这类容器;同一套镜像也能用来构建 Android 项目、跑单元测试,云侧还对接了 Genymotion Cloud 与 AWS 等平台。

避坑与进阶

两个最常踩的坑:容器启动报 KVM 相关错误时,先确认 /dev/kvm 存在且可读,WSL2 场景还要额外开启嵌套虚拟化;默认情况下容器重启会重置被模拟设备,想保留应用数据和已装 APK,需要把卷挂载到 /home/androidusr 目录。

自定义配置常用的开关都是环境变量:EMULATOR_NAME 改模拟器名称,EMULATOR_DATA_PARTITION 调整数据分区(默认 550m),EMULATOR_NO_SKIN=true 去掉设备外壳直接启动,EMULATOR_ADDITIONAL_ARGS 向模拟器透传参数,详见 自定义配置文档。如果还需要 root 权限、无头模式、单容器多模拟器、直接对接 Selenium 4.x Hub,可以看专业版 docker-android-pro,它另外支持公司代理、多语言与更新的 Android 版本。

这篇文章适合需要在无头机器或 CI 里跑 Android 模拟器的移动端开发、测试工程师和 DevOps 从业者。如果手头有一台可用 KVM 的机器,建议先拉一个 emulator_14.0 镜像用 Web VNC 看画面,再补上 ADB 连接,把整条链路走一遍。

【免费下载链接】docker-androidAndroid in docker solution with noVNC supported, video recording and mcp server项目地址: https://gitcode.com/GitHub_Trending/do/docker-android

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 14:17:16

亿级并发下网络型负载均衡NLB的架构选型与部署实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:14:51

五款主流抓包工具横向对比:从Charles到Wireshark的实战选型指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:14:23

电动车冬季续航衰减原理与优化方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:12:39

Java学业预警与重修选课系统设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 14:11:59

Python+Pygame复刻《燃烧的蔬菜》游戏开发全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华