甲骨文ARM利用docker镜像运行Android云手机 web远程桌面

发布于 / 代码·杂谈 / 6 条评论

 

介绍

甲骨文Arm白嫖了一年多,一直吃灰,逛loc发现有大佬发的文章感觉对小白不怎么友好,简单梳理,尝试了一下CPU给的性能很足,挂游戏,挂免签,绰绰有余,更多的花活自己发掘,跟着本篇文章思路走,快速搭建自己的云手机!

一· 检查内核

首先查看一下你的内核版本是否>=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 原生镜像,这里应该是没问题的,如果是已经通过网络dd系统发生的错误,这里不给出解决办法请自己查询。(oracle 自带的ubuntu 20.04正常,其他自测)

三. docker环境

本文章主要是依靠宝塔面板部署,软件商店自行安装docker即可,安装后无需操作!

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

docker run -itd \
    --memory-swappiness=0 \
    --privileged --pull always \
    -v /root/test/data:/data \
    --name=redroid \
    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换成其他的目录,方便你备份
  • 没有映射adb端口,因为我们这里不需要它暴露adb端口到外网
  • redroid/redroid:13.0.0-latest(底层是Android13) 使用的镜像tag,其他版本: https://hub.docker.com/r/redroid/redroid/tags (切换版本或者重置容器时,记得删除原来的映射目录或者选择其他的目录,不然会出错rm -r /root/test/data
  • 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 这个分辨率可以适当调大,因为是web端嘛,自测
  • redroid.gpu.mode=guest 强制选择这个容器的软解如果不加这条参数就是硬解),区别在于:软解更占资源,奇奇怪怪的问题少硬解性能高、资源占用率低能用硬解就用硬解,不同版本硬解/软解问题不同,硬解不能用时再开软解,一般没多大问题。欢迎下方评论区反馈,这个就自测了
  • --rm 最后加上stop容器时删除容器,省得手动删除,因为有目录映射出来,所以重新启动数据也会保存在那个

五.用docker运行scrcpy-ws获得web端

目前ws-scrcpy没有官方镜像,有人提了pr但是都一年多了都没有合并,看原作者的意思是不希望维护docker镜像,需要该pr的人维护,但是提该pr的人可能也觉得麻烦不想维护.....

所以我自己打包了个scrcpy-web镜像push到dockerhub上去了,支持amd64和arm64(其他架构貌似需求不大所以没加),随缘更新,保证可用就行。

docker run --rm -itd --privileged -v /root/scrcpy-web/data:/data --name scrcpy-web -p 127.0.0.1:48000:8000/tcp  --link redroid:myphone1 emptysuns/scrcpy-web:v0.1 
  • -p 127.0.0.1:48000:8000/tcp 这里只映射127.0.0.1,因为我们下面需要用nginx做密码登录,所以只允许本机访问,防止有人扫描抓取,如果你有其他玩法,就改变这个映射端口。
  • --name scrcpy-web 这里最好加个名称,因为后面连接adb要用到,比如这个名称就叫scrcpy-web
  • -v /root/scrcpy-web/data:/data 映射一个目录进去,方便到时候用adb install 安装本地apk,因为启动的安卓容器只能由这个scrcpy-web访问,方便以后本地向容器里传数据。
  • --link redroid:myphone1 意思是本容器连接到其他容器,<你需要连接的容器名称>:<自定义别名>,这里这么写就是为了只需要scrcpy-web容器能连接改adb端口,其他都是拒绝,为了安全。

等待容器启动成功后,用curl访问一下127.0.0.1:48000查看是否启动成功

root@ubuntu:~# curl 127.0.0.1:48000
 
#如果有如下返回值就说明成功
<!doctype html><html lang="en"><head><meta charset="UTF-8"><meta content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" name="viewport"/><title>WS scrcpy</title><script defer="defer" src="bundle.js"></script><link href="main.css" rel="stylesheet"></head><body></body></html>

六. scrcpy-web容器连接adb端口

这个简单,scrcpy-web是你给scrcpy-web镜像启动的容器起的名称,myphone1是安卓容器redroid的自定义别名,如果你没有改动我上面的介绍,直接输入就行。

docker exec -it scrcpy-web adb connect myphone1:5555
connected to myphone1:5555 #出现这个说明启动成功

七.站点配置修改并增加密码登录

1.新建站点 - 绑定域名

2.站点设置 - 网站目录 - 如图自行设置访问密码

 

3.站点配置 - 配置文件 - 添加如下代码

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
upstream websocket {
 
     #这里是scrcpy-web的ip+端口,docker ps可以查看
     #你是如上操作的就是127.0.0.1:48000,因为这里要代理websocket
    server 127.0.0.1:48000; 
}



	location / {
 
		add_header Access-Control-Allow-Origin *;
    		add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    		add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
	     if ($request_method = 'OPTIONS') {
        		return 204;
    		}
		proxy_pass http://websocket;
		proxy_set_header Host $host; 
		proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
}

示例添加仅供参考

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}
upstream websocket {
 
     #这里是scrcpy-web的ip+端口,docker ps可以查看
     #你是如上操作的就是127.0.0.1:48000,因为这里要代理websocket
    server 127.0.0.1:48000; 
}
 
server {
	listen 80;
	listen 443 ssl http2;
    server_name xxxxx 1.2.3.4;
    index index.php index.html index.htm default.php default.htm default.html;
    root /www/wwwroot/xxxxx;

    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    #AUTH_START
    auth_basic "Authorization";
    auth_basic_user_file /www/server/pass/xxxxx.pass;
    #AUTH_END
    #HTTP_TO_HTTPS_START
    if ($server_port !~ 443){
        rewrite ^(/.*)$ https://$host$1 permanent;
    }
    #HTTP_TO_HTTPS_END
    ssl_certificate    /www/server/panel/vhost/cert/xxxxx/fullchain.pem;
    ssl_certificate_key    /www/server/panel/vhost/cert/xxxxx/privkey.pem;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

	location / {
 
		add_header Access-Control-Allow-Origin *;
    		add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    		add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
	     if ($request_method = 'OPTIONS') {
        		return 204;
    		}
		proxy_pass http://websocket;
		proxy_set_header Host $host; 
		proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
}
    access_log  /www/wwwlogs/xxxxx.log;
    error_log  /www/wwwlogs/xxxxx.error.log;
}

一台服务器创建多台云手机

docker run -itd \
    --memory-swappiness=0 \
    --privileged --pull always \
    -v /root/test1/data:/data \
    --name=redroid1 \
    redroid/redroid:12.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

--name=redroid1 容器名称不能重复,之前为redroid这里改为redroid1

-v /root/test1/data:/data \  映射目录做了修改防止冲突

redroid/redroid:12.0.0-latest \  改为安卓12版本      13版本不友好,很多挂机软件无法通过应用侧载功能造成无法使用

scrcpy-ws  web端添加连接多个容器

docker run --rm -itd --privileged -v /root/scrcpy-web/data:/data --name scrcpy-web -p 127.0.0.1:48000:8000/tcp  --link redroid:myphone1  --link redroid1:myphone2 emptysuns/scrcpy-web:v0.1 

--link redroid1:myphone2       别名这里我是直接简单粗暴+1  自己改什么随意啦!

scrcpy-web容器连接adb端口

docker exec -it scrcpy-web adb connect myphone2:5555
connected to myphone2:5555 #出现这个说明启动成功

myphone2  修改成容器的别名

成功出现两台云手机

这里只是简单给个思路,花活疑问自行google解决!

webview浏览器无法下载任何文件怎么办?

第二步用docker运行scrcpy-ws获得web端>里向主机映射了一个目录-v /root/scrcpy-web/data:/data用来向容器里传数据,所以可以这么操作

如果你无法通过webview浏览器下载东西,请装一个via浏览器

下载via.apk放到/root/scrcpy-web/data目录下

docker exec -it scrcpy-web adb install /data/via.apk

延伸操作,如果一台机子开了多台云手机是无法用上面命令安装apk的,所有需要指定一个容器

docker exec -it scrcpy-web adb -s myphone2:5555 install /data/via.apk

myphone2 修改为自定义别名

这样你就离开古老的webview了

至此本篇文章结束,梳理了以下两篇文章,对小白还是很有用的,更多奇淫技巧,科技狠活,关注下边链接

转载自 私は萌いQ(˘•ω•˘) - 人生の幸せな瞬間を記録する

https://blog.imoeq.com/oracle-arm-run-android-by-docker/

https://blog.imoeq.com/scrcpy-run-a-android-web-page/

参考

https://www.cnblogs.com/bzdfxx/p/9767643.html

https://blog.csdn.net/zjt107/article/details/51354702

  1. 甲骨文ARM也就那样,没什么用,我用来挂图床

  2. 跟下面的人一樣,網站打開來是白的
    curl 127.0.0.1:48000也有返回結果
    求救

  3. 请问下,所有步骤都是对的,但是打开网站输入账号密码后,网页一片空白是怎么回事啊。

    1. @fc
      curl 127.0.0.1:48000
      
      执行上边代码返回html内容应该就没啥问题! 如正常返回检查下反代或者反代不加密试试可否正常访问
  4. 请问CPU和内存占用多少?想给手游挂机。
    因为服务器在海外,操作时感觉出明显的延迟吗

    1. @ice 占用还好,手游挂机可能不理想,起初我拿圣何塞arm测试王者农药时,操作延迟是有的,挂个脚本刷金币应该还是可以的,