甲骨文ARM利用docker镜像运行安卓云手机

admin   ·   发表于 2023-1-14   ·   云端

引言

最近找app远程调试环境,最后选择了docker启动容器的比较方便,支持ADB远程连接。使用scrcpy连接可以提供桌面环境,突然发现这个镜像的架构支持Arm64,我还有好几个吃灰的甲骨文,遂试了试体验良好,可以当成一个云手机来挂机。

介绍

甲骨文Arm使用的CPU给的性能很足,4c的geekbench5跑分有足足3400分左右,参考当前最流行的手机处理器芯片骁龙870 geekbench5 3100分来说是非常良心的了。使用它来虚拟一个云手机来说性能充足。

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

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

使用

一· 检查内核

首先查看一下你的内核版本是否>=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 #内存共享模块

上面两个模块都是Android运行所必须的依赖,必须启动成功,否则虚拟化失败,如果这里出错请不要下面的步骤,请自己先解决模块启动失败的问题,如果你是用的oracle 原生镜像,这里应该是没问题的,如果是已经通过网络dd系统发生的错误,这里不给出解决办法请自己查询。(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))这个资源占用最少,性能最好,出问题概率最低。你可以替换成这个我没试过。其他版本: https://hub.docker.com/r/redroid/redroid/tags
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参数,替换掉。方法:https://www.jianshu.com/p/098b8809d85d
redroid.width=720 redroid.height=1280 这个是设置分辨率,对于这种远程ADB来说,这个参数是最好的,如果非常卡可以适当调小
redroid.gpu.mode=guest 强制选择这个容器的软解,使用硬解我连不上adb,这个就自测了
--rm 最后加上stop容器时删除容器,省得手动删除,因为有目录映射出来,所以重新启动数据也会保存在那个映射目录里

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

root@ucbro:~/a# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85ce1da669c5 redroid/redroid:13.0.0-latest "/init qemu=1 androi…" 53 minutes ago Up 53 minutes 0.0.0.0:55555->5555/tcp, :::55555->5555/tcp suspicious_panini

#查看是否如上启动成功

六. 使用ADB连接该容器

这里不需要打开防火墙,因为docker会自动配置

下载 scrcpy-win64,解压
使用目录里的open_a_terminal_here.bat 在本目录打开一个窗口

adb.exe connect 你的ip:你的端口
connected to 你的ip:你的端口

#连接成功后会提示成功,如果没有,而且配置过程中没错误的话,说明是网络问题,请自己加密转发这个端口,或者使用境外服务器做跳板连接,adb连接也是被gfw阻断的一部分

scrcpy.exe

D:\tools\scrcpy-win64>scrcpy.exe
scrcpy 1.24
D:\tools\scrcpy-win64\scrcpy-server: 1 file pushed, 0 skipped. 43.6 MB/s (41159 bytes in 0.001s)
[server] INFO: Device: Xiaomi redroid13_arm64 (Android 13)
INFO: Renderer: direct3d
INFO: Initial texture: 720x1280

#adb连接成功后,直接cmd窗口运行,这个程序就会打开一个安卓的窗口

或者使用AutumnBox连接管理:

七. 成功截图

安装via浏览器测试

八. 停止

#client
D:\tools\scrcpy-win64>adb disconnect
disconnected everything

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

 

常见问题
为什么我运行成功了却连不上?/为什么我连接上这么卡?/为什么连接一段时间就断开卡住了?

这些问题都有一个答案,就是老大哥正在看着你

最近一段时间甲骨文的ip被gfw干到生不如死,你在大陆内很难直接通过adb连接到容器,因为adb协议设计就是用来本地调试的,在远程调试方面没有一点安全性。

因为这属于远程桌面形式,有人也会通过这种形式去做一些wffz的事情,导致老大哥早就考虑到这个问题了,早就对adb远程连接做了限制,而且这协议特征明显很容易识别,这个协议设计就不是为了这样用的。解决办法就是用一个线路好的跳板机去连接你的容器,做好你到跳板机之间的加密。

所以我建议用境外win server 连接,并通过iptables 只允许这个server访问adb端口,或者使用tun模式接管所有流量并同样设置iptables。

是不是有点麻烦,麻烦就对了,要怪就怪老大哥掐你网线吧。

为什么我启动失败?

不知道,如果你仔细阅读如上简介,应该能知道问题在哪儿,如果不知道再读一遍

有封号风险吗?

有,就算你吃灰也有,还不如尽可能用用呢,但是高强度占用cpu很可能被封号,请适度食用

资源占用过高,怕封号怎么办?

我的建议是别高强度挂机,封号和我无关,我只是介绍,并没有按着你的手去让你启动容器并运行高资源占用程序,更没有去封了你的号。

结语说明
如果你单单运行一个容器不挂游戏的话,基本是不吃资源的,这也与这个镜像优化好有关,最好使用4gb以上的Arm运行,防止内存不够,这点内存对甲骨文来说是很简单的啦。

但这里也有不足的地方,比如这个容器无法加密,无法对adb连接进行授权,这个我暂时没找到解决办法,需要通过iptables等防火墙进行限制只有你本地的ip进行访问,或者使用VPN的形式,设置这个容器只能内网访问,通过VPN登入内网,这就靠大家自行发挥了,不然被扫到就是纯纯肉鸡。

0 条回复   |  直到 2023-1-14 | 1270 次浏览
登录后才可发表内容