本地电脑内存有限,开几个模拟器就卡,手边的真机也不够用,想在不同安卓版本上做回归测试更麻烦。把模拟器放到云服务器上跑,是不少团队会选的办法。运行环境在远端,本地用浏览器或 ADB 连过去即可,同事之间也能共用同一个实例复现问题。

这篇文章用 Redroid 和 Docker 搭一个可用的安卓环境,每一步说明为什么这么做,以及容易踩的坑。
什么场景适合放到云服务器上
设想一个常见情况:测试要覆盖安卓 10 到安卓 14 的兼容性,本机同时开三四个模拟器就明显卡顿,换机器又不现实。这时候为每个系统版本起一个容器,测试人员按需连接,用完就停,本地机器的压力会小很多。如果只是偶尔调试一个应用,本地模拟器可能更省事。云端的优势主要体现在多版本、多人共享和批量创建上。
几种常见的实现方式
云服务器上跑安卓,常见的有三种思路:
- Android-x86 加虚拟化:兼容性比较好,但依赖嵌套虚拟化,不少云厂商的机型不支持,性能损耗也偏大。
- Waydroid:基于 LXC 容器,性能表现不错,但对内核版本和显卡驱动要求较高,装不顺的时候排查很费时间。
- Redroid:以 Docker 镜像的形式提供安卓系统,一条命令就能起实例,适合批量创建和切换版本。
如果需求是多版本、可复制,Redroid 配合 Docker 基本是最省心的组合。下面的步骤就以它为例。
第一步:确认内核和资源
系统建议用 Ubuntu 22.04 或更新的版本,配置至少 4 核 CPU、8GB 内存,磁盘留出 30GB 以上空间。安卓能跑起来,前提是内核里有 binder 模块。先检查并加载它:
sudo apt update
sudo apt install -y linux-modules-extra-$(uname -r)
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
ls /dev/binderfs 2>/dev/null || echo "binder 未就绪,请检查内核配置"
如果提示找不到模块,多半是内核版本和模块包对不上。升级内核、重启后再试,通常能解决。
第二步:安装 Docker 并启动安卓容器
装好 Docker 之后,拉取 Redroid 镜像并启动。端口只绑定在 127.0.0.1 上,不要写成 0.0.0.0,否则 ADB 端口会直接暴露在公网。
curl -fsSL https://get.docker.com | sh
sudo docker run -itd --privileged --name redroid13 \
-v ~/redroid13-data:/data \
-p 127.0.0.1:5555:5555 \
redroid/redroid:13.0.0-latest \
androidboot.redroid_width=720 androidboot.redroid_height=1280 androidboot.redroid_dpi=320
–privileged 的权限很大,建议只在独立的测试机上使用,不要和业务服务混跑在同一台机器里。数据目录挂载到宿主机后,重建实例时应用和账号数据不会丢。
容器启动后,等系统开机完成再进行下一步,用下面的命令检查:
sudo docker exec redroid13 getprop sys.boot_completed
返回 1 表示启动完成。如果长时间没有结果,先看一下 docker logs redroid13 的输出,多数问题在日志里会直接提示。
第三步:用 ADB 连接并安装应用
在服务器上装好 adb,连接实例,再安装待测的 APK:
sudo apt install -y adb
adb connect 127.0.0.1:5555
adb devices
adb install -r shop-app-release.apk
要在本地电脑上操作,不建议直接开放 5555 端口,用 SSH 端口转发更稳妥:
ssh -L 5555:127.0.0.1:5555 user@your-server-ip
保持这个 SSH 会话,在本地执行 adb connect 127.0.0.1:5555 就能连上。想看屏幕画面,可以配合 scrcpy 投射到本地窗口。走公网时延迟会明显增加,网络条件差的时候点击反馈会慢半拍,这一点要提前预期。
安全和成本要注意的几件事
ADB 调试接口一旦暴露在公网,等于把设备的控制权交了出去。除了前面说的绑定本机地址,最好再用防火墙限制来源 IP,或者只走 SSH 隧道。SSH 也应关闭密码登录,改用密钥认证。
费用方面,测试结束就停掉容器,计算资源和磁盘占用都能省下来。要频繁创建同一套环境的话,可以把镜像和数据目录整理成模板,之后部署会快很多。数据目录里可能残留测试账号和缓存,做模板前先清理一遍。