利用docker镜像运行安卓云手机

介绍

这里选择的是RedroidReDroidRe mote an Droid)是一个 GPU 加速的 AIC(Android In Container)解决方案。Docker您可以在 Linux 主机(Docker, podman, k8s etc.)中启动许多实例。ReDroid同时支持arm64amd64架构。 ReDroid适用于云游戏、VMI(虚拟移动设备)、自动化测试等。

根据该镜像描述,对云游戏有很好的支持,符合我们的需求,所以这里直接使用它启动容器。

你也可以用来配置python selenium做自动化,因为有root权限,也能用于app开发调试。

性能/资源占用率参考

使用

下方测试系统是oracle 原生 ubuntu 20.04,其他系统我没有一一测试,没什么区别。

一、 检查内核

首先查看一下你的内核版本是否>=5.0,根据介绍,如果内核在此版本之下,许多指令无法适配,为了不出错还是升级一下内核,如果不升级内核该镜像issue也给出解决方案,我懒得看,有兴趣自己研究去。

uname -r
5.15.0-1013-oracle #这里最好>=5.0

二、安装模块

apt install linux-modules-extra-`uname -r`
modprobe binder_linux devices="binder,hwbinder,vndbinder" #进程通信模块
modprobe ashmem_linux #内存共享模块
 
#后两条命令不提示错误 / Enter后没有任何反应说明启动成功

上面两个模块都是Android运行所必须的依赖,必须启动成功,否则虚拟化失败,如果这里出错请不要下面的步骤,请自己先解决模块启动失败的问题(oracle 自带的ubuntu 20.04正常,其他自测)

三、 安装docker环境

怕有些人连docker是什么都不知道,这里用docker提供的脚本一键安装环境

curl -fsSL https://get.docker.com | bash

四、拉取docker镜像并启动容器

docker run -itd \
    --memory-swappiness=0 \
    --privileged --pull always \
    -v /root/test/data:/data \
    -p 55555:5555 \
    redroid/redroid:13.0.0-latest \
    androidboot.hardware=mt6891 ro.secure=0 ro.boot.hwc=GLOBAL    ro.ril.oem.imei=861503068361145 ro.ril.oem.imei1=861503068361145 ro.ril.oem.imei2=861503068361148 ro.ril.miui.imei0=861503068361148 ro.product.manufacturer=Xiaomi ro.build.product=chopin \
    redroid.width=720 redroid.height=1280 \
    redroid.gpu.mode=guest \
    --rm

解释这条命令:

  • run -itd 意思是后台运行
  • --memory-swappiness=0 禁止swap,防止I/O成为性能瓶颈,甲骨文Arm给的内存挺多的,满配24g内存,不用担心用得完
  • --privileged 启动特权模式,使用该参数,container内的root拥有真正的root权限。防止奇奇怪怪的毛病
  • -v /root/test/data:/data 映射目录,你可以把/root/test/data换成其他的目录,方便你备份
  • -p 55555:5555 映射ADB端口,这个我选择是55555,你可以选择其他端口,最好修改一个,防止扫描器扫描
  • redroid/redroid:13.0.0-latest(底层是Android13) 使用的镜像tag,这里我选择这个tag,redroid:8.1.0-arm64(底层是Android8)这个资源占用最少,性能最好,出问题概率最低。[其他版本](切换版本或者重置容器时,记得删除原来的映射目录或者选择其他的目录,不然会出错
  • androidboot.hardware=mt6891 ro.secure=0 ro.boot.hwc=GLOBAL ro.ril.oem.imei=861503068361145 ro.ril.oem.imei1=861503068361145 ro.ril.oem.imei2=861503068361148 ro.ril.miui.imei0=861503068361148 ro.product.manufacturer=Xiaomi ro.build.product=chopin 这部分是白嫖群友的,据他说是红米Note10的参数,这个是为了模拟一下手机型号,某些游戏检测到不合法的手机型号会封号,感兴趣自己抓一下build.prop参数,替换掉。方法:[ 手机设备信息与 Android build.prop 文件 ]
  • redroid.width=720 redroid.height=1280 这个是设置分辨率,对于这种远程ADB来说,这个参数是最好的,如果非常卡可以适当调小
  • redroid.gpu.mode=guest 强制选择这个容器的软解如果不加这条参数就是硬解),区别在于:软解更占资源,奇奇怪怪的问题少硬解性能高、资源占用率低能用硬解就用硬解,不同版本硬解/软解问题不同,硬解不能用时再开软解,一般没多大问题。欢迎下方评论区反馈,这个就自测了
  • --rm 最后加上stop容器时删除容器,省得手动删除,因为有目录映射出来,所以重新启动数据也会保存在那个映射目录里

五、输入如上命令后查看运行状态

[root@Seoul-ARM:~]# docker ps
CONTAINER ID   IMAGE                           COMMAND                  CREATED        STATUS        PORTS                                                                      NAMES
beb98af54313   redroid/redroid:13.0.0-latest   "/init qemu=1 androi…"   7 weeks ago    Up 7 weeks    192.168.21.7:5555->5555/tcp                                                android
 
#查看是否如上启动成功

六、安全性防护

请必须让自己的容器仅能从自己的内网登录,不然机器被扫描到就会变成妥妥的肉鸡,请自行用vpn登录或者使用iptables做来源地址的限制,下面给出iptables限制来源的参考

  1. 查看你网卡的名称,方便修改iptables

    #下面有很多网卡名称,选择你上网用的,比如arm ubuntu 20.04里就是 enp0s3
    [root@Seoul-ARM:~]# ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
        inet6 ::1/128 scope host 
           valid_lft forever preferred_lft forever
    2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
        link/ether 02:00:17:01:02:df brd ff:ff:ff:ff:ff:ff
        inet 10.0.0.242/24 brd 10.0.0.255 scope global enp0s3
           valid_lft forever preferred_lft forever
        inet6 fe80::17ff:fe01:2df/64 scope link 
           valid_lft forever preferred_lft forever
    5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
        link/ether 02:42:88:45:4f:18 brd ff:ff:ff:ff:ff:ff
        inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:88ff:fe45:4f18/64 scope link 
           valid_lft forever preferred_lft forever
    6: br-8c53677fe1b0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:4f:57:11:4f brd ff:ff:ff:ff:ff:ff
        inet 192.168.17.1/24 brd 192.168.17.255 scope global br-8c53677fe1b0
           valid_lft forever preferred_lft forever
        inet6 fe80::42:4fff:fe57:114f/64 scope link 
           valid_lft forever preferred_lft forever
    24: veth25d14e9@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-8c53677fe1b0 state UP group default 
        link/ether 42:3d:b8:c4:4a:65 brd ff:ff:ff:ff:ff:ff link-netnsid 1
        inet6 fe80::403d:b8ff:fec4:4a65/64 scope link 
           valid_lft forever preferred_lft forever
    46: veth7ec6a7f@if45: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-8c53677fe1b0 state UP group default 
        link/ether 5e:aa:92:6c:a3:ec brd ff:ff:ff:ff:ff:ff link-netnsid 2
        inet6 fe80::5caa:92ff:fe6c:a3ec/64 scope link 
           valid_lft forever preferred_lft forever
    102: vethbfb4af8@if101: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-8c53677fe1b0 state UP group default 
        link/ether a6:a5:2b:7e:33:ff brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet6 fe80::a4a5:2bff:fe7e:33ff/64 scope link 
           valid_lft forever preferred_lft forever
    
  2. docker-user里增加iptables规则,只允许你梯子ip访问adb端口,55555改成你的docker映射出的adb端口,1.2.3.4改成你跳板的ip地址,enp0s3改成你上网网卡的名称。

    iptables -I DOCKER-USER -i enp0s3 -p tcp -m conntrack --ctorigdstport 55555 ! -s 1.2.3.4 -j  DROP
    

    这样只有你跳板的ip能够访问你的容器了,其他人会被drop掉

    如果使用了netfilter-persistent或者firewall-cmd,请使用下方命令,保存防火墙规则防止重启系统后规则消失

    netfilter-persistent save
    firewall-cmd --runtime-to-permanent
    

七、使用adb程序连接

  1. 下载 scrcpy-win64,解压

  2. 使用目录里的open_a_terminal_here.bat 在本目录打开一个窗口

    C:\remote-adb>adb connect 1.2.3.4:55555
    connected to 1.2.3.4:55555
     
     #连接成功后会提示成功,如果没有,而且配置过程中没错误的话,说明是网络问题
    

    如果你是用我如上第六点增加了防火墙规则,这里直接连接是不会连上的,因为只允许你的跳板ip访问。到这里你就完成adb连接和安全性保障了,记得netch模式选择你刚才创建的模式,接下来启动桌面。

  3. 通过adb连接到容器,使用scrcpy桌面环境:

    如果觉得桌面不流畅,说明延迟高。可选参数:

    • -b384k :比特率 384kbps。严重影响画质

    • -m960 :将屏幕大小调整为正常大小的一半(假如你分辨率为1920)。极大地影响延迟

      例:scrcpy.exe -b384k -m960`

    C:\remote-adb>scrcpy.exe
    scrcpy 1.24 <https://github.com/Genymobile/scrcpy>
    C:\remote-adb\scrcpy-server: 1 file pu...pped. 2.8 MB/s (41159 bytes in 0.014s
    [server] INFO: Device: Xiaomi redroid13_arm64 (Android 13)
    INFO: Renderer: direct3d
    INFO: Initial texture: 720x1280
    WARN: Killing the server...
     
    #adb连接成功后,直接cmd窗口运行,这个程序就会打开一个安卓的窗口
    

八、成功截图

八、停止

客户端:

C:\remote-adb>adb disconnect
disconnected everything

服务端:

docker stop <CONTAINER ID>#因为加了rm,所以停止即删除,数据在映射目录里

转载请注明来源