Redroid
突发奇想,想部署一个云手机玩玩,正好自己有一个 ARM 服务器,用来虚拟安卓手机相当合适。这里选择的是 Redroid,ReDroid (remote android) 是一个能够利用 Docker 部署的,支持 GPU 加速的 AIC (Android In Container) 解决方案。ReDroid 同时支持 arm64 和 amd64 架构。适用于云游戏、VMI(虚拟移动设备)、自动化测试等。
重新编译内核
通过 Redroid文档 可以知道,Redroid 需要两个内核模块支持:ashmem(主线内核在5.18 drop了这个模块,官方的替代方案是memfd,而且redroid也提供了androidboot.use_memfd=1来启用memfd支持)和 binder。
因此这里需要在 Linux 内核源码中增加下列配置项:
1 2 3 4 5 6 7 8 9
| CONFIG_ANDROID_BINDER_IPC=y CONFIG_ANDROID_BINDERFS=y CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder" CONFIG_ANDROID_BINDER_IPC_SELFTEST=y
CONFIG_ASHMEM=y
CONFIG_MEMFD_CREATE=y
|
重新编译并替换内核
检查内核相关模块是否存在
1 2 3
| sudo grep binder /proc/filesystems
sudo grep ashmem /proc/misc
|

增加 systemd.unified_cgroup_hierarchy=0
经过测试,我的 ARM 服务器还需要在 /boot/cmdline.txt 中增加 systemd.unified_cgroup_hierarchy=0 才能正常启动 Redroid
1 2 3 4 5
| ┌[allen☮Ubuntu]-(~) └> cat /proc/cmdline root=LABEL=emmc-rootfs rw rootfstype=ext4 console=ttyS0,115200n81 quiet systemd.unified_cgroup_hierarchy=0 splash plymouth.ignore-serial-consoles vt.global_cursor_default=1 irqchip.gicv3_pseudo_nmi=0 net.ifnames=0 rtleth=ethaddr:6a:3b:0f:c3:0c:8b ┌[allen☮Ubuntu]-(~) └>
|
部署 Redroid
官方提供的 Docker 镜像仓库 redroid
拉取镜像
这里用 Android 11 测试
1
| sudo docker pull redroid/redroid:11.0.0-latest
|
启动容器
1
| sudo docker run -d --privileged --name android -p 5555:5555 -v ~/data11:/data redroid/redroid:11.0.0-latest
|
安装 Scrcpy
Linux 里面可以直接使用 apt 安装
Window 可以直接从Scrcpy 的 Git 仓库下载
连接adb
1
| adb connect 127.0.0.1:5555
|
启动 Scrcpy
1
| scrcpy --serial 127.0.0.1:5555
|
启动成功,但是发现运行比较卡,而且可以观察到宿主机 CPU 占用率很高,用 Aida64 看一下,果然 GPU 没能识别出来。
拉取支持 rk3588 GPU 加速的镜像
官方的相关 issues 有提到 RK3588 芯片如果要使用 GPU,需要添加额外的图形库。
在另一个 issues 中,有大佬分享了自己打包的镜像,感谢大佬😉
这里直接拉取测试一下
1
| sudo docker pull shangzebei/rk3588:latest
|
还有一个支持 GPU 的 docker 镜像是
1
| sudo docker pull registry.cn-hangzhou.aliyuncs.com/whsyf/dobox:rk3588-202303011
|
启动新的容器
shangzebei/rk3588
1
| sudo docker run -d --privileged --name android -p 5555:5555 -v ~/data12:/data -v /dev/net/tun:/dev/tun -v /dev/mali0:/dev/mali0 shangzebei/rk3588 androidboot.redroid_gpu_mode=mali
|
dobox:rk3588-202303011
1 2 3 4 5 6 7 8
| docker run -itd --rm --privileged \ --pull always \ -v /mmc/zcg1:/data \ -v /dev/net/tun:/dev/tun \ -v /dev/mali0:/dev/mali0 \ -p 5555:5555 \ --name dobox1 \ registry.cn-hangzhou.aliyuncs.com/whsyf/dobox:rk3588-202303011
|
运行测试
直接 Scrcpy 连接容器,明显流畅很多,Aida64 看一下,GPU 能够正常识别
