vps搭建云手机

AI摘要

正在生成中……


先安装一个测试容器,确保你的系统可以运行redroid

首先先检查你的内核版本:

1
2
uname -r        #查看内核命令
#内核最好是大于5.0的

然后输入以下命令:

1
2
3
4
apt install linux-modules-extra-`uname -r`
modprobe binder_linux devices="binder,hwbinder,vndbinder"
modprobe ashmem_linux
#这几条命令,都不能报错,否则后面会出问题,不过最后一条在高版本内核好像是可选的,具体可以看redroid的官方文档

如果你这里出现了问题,那么你最好更换一个内核,我现在自己使用的内核是5.4.0-169-generic,你也可以尝试其他内核或者自己编译一个,这一方面自行谷歌。如果你实在是找不到符合的内核,或者说不会换内核,那么你可以尝试dd一个新的系统,我使用这个项目的脚本重装至ubuntu20.04系统,默认的内核就可以直接搭建,反而是更新后的不支持。

解决内核问题后你就可以开始安装了,首先你先安装一个docker

1
apt install docker.io

静待一会以后自动安装成功,首先你先安装一个最普通的,确保你的系统真的可以安装并使用安卓虚拟机

1
2
3
docker run -itd --memory-swappiness=0 --rm --privileged --pull always \
-v /home/ubuntu/redroid/data:/data -p 55555:5555 \
--name test redroid/redroid:11.0.0-latest androidboot.redroid_gpu_mode=guest

这里我使用的是安卓11,足够使用了,而且后续装magisk的教程也是基于安卓11的镜像来做的。

当这个容器部署完成以后你可以在你本地使用adb进行连接

1
adb connect 你的ip:55555

如果出现connected to 你的ip:55555,那就说明成功了,那么你可以直接使用scrcpy将画面投至你的电脑上了

如果你的电脑出现了Android窗口,那么恭喜你成功了。如果没有出现,那你可以把报错信息复制到redroid项目的issues进行搜索,一般都会有解答。

如果你成功了,那么你可以关闭这个容器了,因为这只是一个测试容器,将adb端口直接暴露在公网上是很不安全的,而且这个安卓系统不能为某一个应用程序分配root权限,所以我们需要再修改以下。

1
docker stop test        #删除这个容器

接下来就是为我们的容器安装magisk

先创建并且进入一个文件夹:

1
2
mkdir ~/MagiskOnRedroid
cd ~/MagiskOnRedroid

下面这段可以写成一个脚本:

1
vim a.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash
# 删除当前目录中与 magisk 相关的文件夹(除 .apk 文件)
find -maxdepth 1 -iname "magisk*" -not -name "*.apk" -exec rm -r {} \;

magisk_file="app-debug.apk"
# 下载 Magisk 9b61bdfc(25201) debug 版本(如果未下载)
if [ ! -f $magisk_file ]; then
wget "https://cdn.jsdelivr.net/gh/topjohnwu/magisk-files@1cea72840fbf690f9a95512d03721f6a710fe02e/app-debug.apk"
fi

# 因为我是 amd64 架构,所以解压 amd64 版本的库文件
unzip -j $magisk_file "lib/amd64-v8a/libmagisk64.so" -d magisk
unzip -j $magisk_file "lib/amd64-v8a/libbusybox.so" -d magisk

# 将解压后的文件移动到 magisk 目录
mv -v magisk/libmagisk64.so magisk/magisk
mv -v magisk/libbusybox.so magisk/busybox

# 目录结构示例
# tree ~/MagiskOnRedroid
# .
# ├── app-debug.apk
# └── magisk
# ├── busybox
# └── magisk

给予权限然后运行

1
2
chmod u+x a.sh
bash a.sh

运行完毕以后再运行一下打包命令将magisk压缩

1
tar --transform 's/.*\///g' -cf ~/magisk.tar --absolute-names $( find ~/MagiskOnRedroid | grep -E "magisk/|app-debug.apk$" )

再写一个脚本:

1
vim ~/remove.rc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#内容如下:
#!/bin/bash
on early-init
export PATH /sbin:/product/bin:/apex/com.android.runtime/bin:/apex/com.android.art/bin:/system_ext/bin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin
chmod 0700 /magisk.tar
chown root root /magisk.tar
chmod 0700 /setup.sh
chown root root /setup.sh
exec root root -- /setup.sh
service magisk-d /sbin/magisk --daemon
user root
oneshot
on boot
start magisk-d
on post-fs-data
start logd
rm /dev/.magisk-unblock
start s1
wait /dev/.magisk-unblock 5
rm /dev/.magisk-unblock
service s1 /sbin/magisk --post-fs-data
user root
oneshot
service s2 /sbin/magisk --service
class late_start
user root
oneshot
on property:sys.boot_completed=1
exec /sbin/magisk --boot-complete
on property:init.svc.zygote=restarting
exec /sbin/magisk --zygote-restart
on property:init.svc.zygote=stopped
exec /sbin/magisk --zygote-restart

还是给予权限

1
2
sudo chmod 644 ~/remove.rc
sudo chown root:root ~/remove.rc

最后再写一个脚本

1
vim ~/setup.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/system/bin/sh

# rm /system/fonts/NotoColorEmoji.ttf
tmpPushed=/magisk
rm -rf $tmpPushed
mkdir $tmpPushed
tar -xvf /magisk.tar --no-same-owner -C $tmpPushed
umount /magisk.tar ; rm -v /magisk.tar
mkdir /sbin
chown root:root /sbin
# chmod 0700 /sbin
chmod 0751 /sbin
cp $tmpPushed/magisk /sbin/
cp $tmpPushed/app-debug.apk /sbin/stub.apk
find /sbin -type f -exec chmod 0755 {} \;
find /sbin -type f -exec chown root:root {} \;
# add /sbin
# /sbin/
# ├── magisk
# └── stub.apk


ln -f -s /sbin/magisk /system/xbin/su
mkdir /product/bin
chmod 751 /product/bin
ln -f -s /sbin/magisk /product/bin/su
# add su (override `/system/xbin/su`)
# /product/bin/
# └── su -> /sbin/magisk

mkdir -p /data/adb/magisk
chmod 700 /data/adb
mv $tmpPushed/busybox /data/adb/magisk/
chmod -R 755 /data/adb/magisk
chmod -R root:root /data/adb/magisk
# /data/adb/
# ├── magisk
# │ └── busybox

# rm -rf $tmpPushed

还是给予权限

1
2
sudo chmod 700 ~/setup.sh
sudo chown root:root ~/setup.sh

结束了,再启动一个测试容器试试

1
2
3
4
5
6
7
8
9
sudo docker run -itd --privileged \
--name a11 \
-p 55555:5555 \
-v ~/data:/data \
-v ~/remove.rc:/vendor/etc/init/remove.rc \
-v ~/setup.sh:/setup.sh \
-v ~/magisk.tar:/magisk.tar \
redroid/redroid:11.0.0-latest \
ro.secure=0 androidboot.redroid_gpu_mode=guest

安装magisk部分全部都是来自这里,我只是用我自己的话又说了一遍而已。

再次使用adb连接,然后使用scrcpy投影,不过这次要打开安装的magisk,看看到底安装成功没有,如果成功,那么就可以删除进行下一步了

设置成用浏览器访问

1
2
3
4
5
6
7
8
9
sudo docker run -itd --privileged \
--name a11 \
-p 127.0.0.1:55555:5555 \
-v /root/apk/data:/data \
-v /root/apk/remove.rc:/vendor/etc/init/remove.rc \
-v /root/apk/setup.sh:/setup.sh \
-v /root/apk/magisk.tar:/magisk.tar \
redroid/redroid:11.0.0-latest \
ro.secure=0 androidboot.redroid_gpu_mode=guest 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
1
2
3
4
5
6
docker run -itd --privileged \
-v /root/apk/scrcpy-web/data:/data \
--name scrcpy-web \
-p 127.0.0.1:48000:8000/tcp \
--link a11:myphone1 \
emptysuns/scrcpy-web:v0.1

进入容器手动adb连接

1
2
3
4
5
6
7
8
# 进入scrcpy-web容器
docker exec -it scrcpy-web sh
# 查看连接地址
env
# adb连接
adb connect 172.17.0.2:5555
# 查看连接设备
adb devices

最后域名反代127.0.0.1:48000, 设置密码访问