软件运维 --- 容器化 之 Docker安装安卓redroid
一、什么是 redroid?
redroid(Remote Android)是开源的 GPU 加速云安卓方案,在 Linux 的 Docker/Podman/K8s 里运行完整 Android 系统容器,支持 amd64 和 arm64 架构。通过 ADB 连接,配合 scrcpy 实现屏幕投屏,适合自动化测试、CI 集成和云手机原型验证。
二、环境要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Linux(推荐 Ubuntu 24.04) |
| Docker | Engine + Compose V2 |
| 内存 | ≥ 2~4 GB |
| 权限 | privileged: true |
| 端口 | 宿主机 15555 → 容器 5555 |
⚠️ Docker Desktop(Windows/macOS)不可用,容器必须跑在 Linux 上。
三、镜像标签选择
| 标签 | 说明 | 推荐 |
|---|---|---|
15.0.0_64only-latest |
Android 15 纯 64 位 | ✅ 本文推荐 |
15.0.0-latest |
Android 15,支持 32 位 APK | 兼容需求时用 |
16.0.0_64only-latest |
Android 16,ADB 能连但无 Display | 不推荐看屏 |
14.0.0_* 及更旧 |
旧版 Android | 兼容旧包 |
四、部署步骤
第一步:准备内核模块(必做)
Bash
# 安装并加载 binder
sudo apt install -y linux-modules-extra-$(uname -r)
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
# 挂载 binderfs(Ubuntu 24.04 无 /dev/binder,改用 binderfs)
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs
ls -l /dev/binderfs/ # 看到 binder/hwbinder/vndbinder 即成功
Ubuntu 24.04 内核 ≥ 5.18 已移除 ashmem,
modprobe ashmem_linux报错属正常,后续用androidboot.use_memfd=1替代。
设置开机自动加载:
Bash
echo 'binder_linux' | sudo tee /etc/modules-load.d/redroid-binder.conf
echo 'binder /dev/binderfs binder defaults,nofail 0 0' | sudo tee -a /etc/fstab
第二步:拉取镜像
Bash
docker pull docker.xuanyuan.run/redroid/redroid:15.0.0_64only-latest
第三步:编写 compose.yml
YAML
services:
redroid:
image: docker.xuanyuan.run/redroid/redroid:15.0.0_64only-latest
container_name: redroid
restart: unless-stopped
privileged: true
volumes:
- ./data15:/data
ports:
- "15555:5555"
command:
- androidboot.use_memfd=1
- androidboot.redroid_width=720
- androidboot.redroid_height=1280
- androidboot.redroid_dpi=320
# 有 GPU 时取消注释:
# - androidboot.redroid_gpu_mode=auto
第四步:启动容器
Bash
sudo mkdir -p /www/wwwroot/redroid/data15
cd /www/wwwroot/redroid
docker compose up -d
docker compose ps # 确认状态为 Up,端口为 15555->5555
第五步:ADB 连接
Bash
adb kill-server
adb connect 127.0.0.1:15555
adb devices # 期望显示 127.0.0.1:15555 device
容器启动后需等待 30~60 秒再连接,系统启动需要时间。
第六步:Windows scrcpy 投屏
在 Windows 端(有桌面的机器)执行:
Bash
adb.exe connect 192.168.1.xxx:15555
scrcpy.exe -s 192.168.1.xxx:15555
五、关键配置参数
| 参数 | 说明 | 默认值 |
|---|---|---|
androidboot.redroid_width/height |
分辨率 | 720×1280 |
androidboot.redroid_dpi |
DPI | 320 |
androidboot.redroid_fps |
帧率 | GPU 约30,软件约15 |
androidboot.use_memfd |
替代 ashmem | false(新内核用 1) |
androidboot.redroid_gpu_mode |
GPU 模式:guest/host/auto | guest |
六、安全注意事项
- ADB 不要暴露到公网,只走内网、VPN 或 SSH 隧道
privileged: true权限极高,严格控制 Docker 套接字访问/data目录(./data15)含完整 Android 数据,需妥善备份- 换大版本时必须使用独立数据目录,不可复用旧
/data
七、多实例部署
修改以下三项即可启动多个实例:
container_name(如 redroid2)- 宿主机端口(如
15556:5555) - 数据目录(如
./data16:/data)
八、常见问题速查
| 问题 | 原因 | 解决 |
|---|---|---|
ashmem_linux not found |
内核 ≥ 5.18 已移除 | 加 use_memfd=1,正常现象 |
/dev/binder 不存在 |
新内核改用 binderfs | 挂载 /dev/binderfs |
| 容器启动即退出 | binder 未加载或未挂载 | 检查 dmesg -T |
出现 emulator-5554 offline |
宿主机占用了 5555 端口 | 端口映射必须用 15555:5555 |
| scrcpy 报 XDG 错误 | 在无桌面服务器上运行 | 改在 Windows/有桌面机器运行 |
| Android 16 无法投屏 | 该版本暂无 Display 支持 | 改用 Android 15 镜像 |
九、命令速查
Bash
# 完整流程
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo mount -t binder binder /dev/binderfs
docker compose up -d
adb connect 127.0.0.1:15555
# 日常管理
docker compose ps / down
docker exec redroid getprop sys.boot_completed # 值为 1 表示启动完成
docker exec redroid logcat -d | tail
# 调试信息收集
curl -fsSL https://raw.githubusercontent.com/remote-android/redroid-doc/master/debug.sh | sudo bash -s -- redroid
十、总结
redroid 是低成本自托管云安卓的最佳开源方案,核心要点:
- 仅支持 Linux,内核必须先完成 binderfs 挂载
- 推荐 Android 15(
15.0.0_64only-latest),ADB + scrcpy 完整可用 - 端口用 15555,避免与 ADB 默认 5555 冲突
- scrcpy 投屏在客户端(Windows/带桌面电脑),服务器只需运行容器
- ADB 不暴露公网,安全第一
安装脚本备份
https://gitee.com/null_465_7266/docker-installation-script.git
免责声明
本文档所有内容仅供安全研究、学术交流与技术学习使用,严禁用于任何未经授权的逆向破解、网络攻击、隐私窃取、恶意软件开发及其他违反《中华人民共和国网络安全法》《数据安全法》等法律法规的行为,使用者应确保已获得目标软件权利人的合法授权并自行承担因使用本文档内容所产生的一切法律责任与后果,作者不对任何直接或间接损害承担任何责任,继续阅读即视为您已知悉并同意上述全部条款。
浙公网安备 33010602011771号