做移动端运维或者测试开发的兄弟,估计都遭过这种罪:业务方催着要一套自动化测试环境,你哼哧哼哧找台物理机,装 Android Studio,配 SDK,折腾半天。好不容易跑通了,过两天开发改了 Gradle 版本,或者谁手欠动了下环境,整个测试集群直接趴窝。
这种“手工作坊”的日子我是过够了。为了解决环境一致性问题,云栈社区 最近在内部落地了一套基于 Docker 的方案。今天就把这个开源项目 docker-android 拿出来说道说道,教大家怎么像管微服务一样,把 Android 模拟器也塞进容器里。
一、 咱们为啥非要容器化?
在传统的 Android / iOS 开发流程里,环境就是个玄学。开发用 Mac,测试用 Windows,CI 跑在 Linux 虚拟机上。代码在开发机上跑得好好的,一上流水线就报错,这种锅背得太冤。
而且,为了跑自动化测试专门养几台高性能物理机,成本属实有点高。我们需要的是一种能按需启动、用完即焚,且环境绝对纯净的方案。
二、 核心利器:docker-android
GitHub 上有不少类似的镜像,但 HQarroum/docker-android 是我目前用下来最顺手的一个。
它不是简单地把模拟器塞进 Ubuntu,而是基于 Alpine Linux 构建的。懂行的都知道,Alpine 意味着极致的轻量和安全。它解决了最让运维头疼的三个问题:
- 体积小:基础镜像小,拉取快。
- 性能猛:支持 KVM 硬件直通。这点太关键了,没有 KVM 的模拟器就是幻灯片,有了 KVM,容器里的模拟器速度能接近真机。
- 全自动:容器一启动,自动创建 AVD(虚拟设备)并把 ADB 端口暴露出来,完美契合 云原生 / IaaS 的弹性伸缩需求。
三、 动手实战(含避坑点)
1. 关键前置条件
别急着 docker run,先看你的宿主机(Linux)支不支持 KVM。这是硬指标,不支持就别折腾了,卡到你怀疑人生。
# 运行这个命令,如果有输出内容,说明稳了
ls -al /dev/kvm
2. 启动容器
这里有个坑,必须加 --privileged 和 --device /dev/kvm,否则容器拿不到硬件权限。
下面这个命令会启动一个 Android 13 (API 33) 的模拟器:
docker run -d \
--privileged \
--device /dev/kvm \
-p 5555:5555 \
-e API_LEVEL=33 \
-e ARCHITECTURE=x86_64 \
--name android-container \
hqarroum/docker-android
3. 远程连接
容器跑起来后,ADB 服务会监听 5555 端口。你在任何一台装了 ADB 的机器上都能连它:
# 连它!
adb connect <宿主机IP>:5555
# 连上之后,该跑脚本跑脚本,该装包装包
./gradlew connectedAndroidTest
四、 进阶:扔进 Jenkins 流水线
在 云栈社区( https://yunpan.plus ) 的生产环境里,我们肯定不会手动去敲命令。最爽的玩法是结合 Jenkins 或 GitLab CI。
利用 Docker 的特性,每次构建开始时拉起一个全新的模拟器,测试跑完直接销毁容器。这才是标准的 运维 / DevOps / SRE 最佳实践,彻底杜绝了“环境污染”导致的测试不准。
// Jenkinsfile 参考写法
stage('Test on Android') {
agent {
docker {
image 'hqarroum/docker-android:latest'
// 这一行千万别漏,漏了就跑不起来
args '--privileged --device /dev/kvm'
}
}
steps {
// 等待模拟器这就绪的逻辑建议加上
sh 'adb connect localhost:5555'
sh 'npm run appium-test'
}
}
五、 几句掏心窝子的建议
- 内存要给够:Android 模拟器是吃内存大户,别抠搜的。每个容器建议预留 4GB 以上内存,不然 OOM 杀进程的时候别哭。
- 云服务器选型:如果你是在阿里云或 AWS 上跑,普通的 ECS/EC2 实例通常是不支持嵌套虚拟化的(也就是虚拟机里跑虚拟机)。你得买“裸金属”实例,或者专门支持嵌套虚拟化的机型,买之前先看文档。
- 安全问题:5555 端口开了就是裸奔,内网跑跑行,千万别暴露在公网,否则谁都能连上来给你装个全家桶。
配套资源:
🔗 项目仓库:https://github.com/HQarroum/docker-android
🔗 Android 底层开发:https://yunpan.plus/t/341
🔗 Linux 系统运维:https://yunpan.plus/f/33
关注「云栈运维云原生」,每天聊点实用的技术干货。
标签:#docker-android #Github #DevOps #自动化测试 #容器化