众所周知,现在市面上的云手机都价格不菲,为了挂部落冲突而每天花个一两元还是有些不值得。正好最近看到一个redroid的项目可以在linux系统上创建一个安卓容器,刚好手上又有一台甲骨文的免费ARM服务器。配置是4C24G,挺高了,拿来做云手机也够了。现在网上的教程也不算太多,而且很多都一样,也都多少有点小问题,终于在我两天的无数次踩坑下我搭建好了。
首先你要有一台性能比较强的vps,我的甲骨文ARM在搭建好后用脚本挂着部落冲突,cpu占用在70%至90%左右。而且vps最好是arm64的,虽然amd64也行但是本教程是根据我的arm机器写的,以及系统最好是ubuntu20.04,不同的系统搭建方法略微有些区别。
先安装一个测试容器,确保你的系统可以运行redroid
首先先检查你的内核版本:
uname -r #查看内核命令
内核最好是大于5.0的
然后输入以下命令:
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
curl -fsSL https://get.docker.com | bash
静待一会以后自动安装成功,首先你先安装一个最普通的,确保你的系统真的可以安装并使用安卓虚拟机
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进行连接
adb connect 你的ip:55555
如果出现connected to 你的ip:55555,那就说明成功了,那么你可以直接使用scrcpy将画面投至你的电脑上了
下载好scrcpy并且配置好环境变量后可以直接输入
scrcpy
如果你的电脑出现了Android窗口,那么恭喜你成功了。如果没有出现,那你可以把报错信息复制到redroid项目的issues进行搜索,一般都会有解答。
如果你成功了,那么你可以关闭这个容器了,因为这只是一个测试容器,将adb端口直接暴露在公网上是很不安全的,而且这个安卓系统不能为某一个应用程序分配root权限,所以我们需要再修改以下。
docker stop test #删除这个容器
接下来就是为我们的容器安装magisk
先创建并且进入一个文件夹:
mkdir ~/MagiskOnRedroid
cd ~/MagiskOnRedroid
下面这段可以写成一个脚本:
vim a.sh
#脚本内容如下:
#!/bin/bash
find -maxdepth 1 -iname "magisk*" -not -name "*.apk" -exec rm -r {} ;
magisk_file="app-debug.apk"
# download Magisk 9b61bdfc(25201) debug as you did i guess
if [ ! -f $magisk_file ]; then
wget "https://cdn.jsdelivr.net/gh/topjohnwu/magisk-files@1cea72840fbf690f9a95512d03721f6a710fe02e/app-debug.apk"
fi
# 这里因为我是arm64所以改了一下
unzip -j $magisk_file "lib/arm64-v8a/libmagisk64.so" -d magisk
unzip -j $magisk_file "lib/arm64-v8a/libbusybox.so" -d magisk
mv -v magisk/libmagisk64.so magisk/magisk
mv -v magisk/libbusybox.so magisk/busybox
# $ tree ~/MagiskOnRedroid
# .
# ├── app-debug.apk
# └── magisk
# ├── busybox
# └── magisk
给予权限然后运行
chmod u+x a.sh
bash a.sh
运行完毕以后再运行一下打包命令将magisk压缩
tar --transform 's/.*///g' -cf ~/magisk.tar --absolute-names $( find ~/MagiskOnRedroid | grep -E "magisk/|app-debug.apk$" )
再写一个脚本:
vim ~/remove.rc
内容如下:
#!/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
还是给予权限
sudo chmod 644 ~/remove.rc
sudo chown root:root ~/remove.rc
再写一个脚本
vim ~/setup.sh
#!/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
还是给予权限
sudo chmod 700 ~/setup.sh
sudo chown root:root ~/setup.sh
结束了,再启动一个测试容器试试
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,看看到底安装成功没有,如果成功,那么就可以删除进行下一步了
安装ws-scrcpy并且设置网页鉴权
最后就是安装ws-scrcpy,这样就可以不用本地下载scrcpy了,可以直接在网页中连接,而且网页还有鉴权功能,更加安全,具体的可以看这位大佬的博客。
这里给一个安装了magisk的容器的启动命令,就可以不用大佬博客中的启动命令了
sudo docker run -itd --privileged
--name a11
-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 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
注意这里的容器名称是a11而大佬博客中的是redroid8,所以以下命令也要修改一下
docker run --rm -itd --privileged -v /root/scrcpy-web/data:/data --name scrcpy-web -p 127.0.0.1:48000:8000/tcp --link a11:myphone1 emptysuns/scrcpy-web:v0.1
剩下的就都差不多了,注意容器名称就好了。
挂好部落冲突以后,就可以一直运行了,最后结果截图:
虽然很模糊,但是至少能用不是。
以上这篇文章全部都是我四处搜寻其他大佬的博客以及官方文档而来,非常感谢各位大佬,我只是整合了一下用自己的话描述了一下而已。
感谢:
redroid项目:https://github.com/remote-android/redroid-doc
magisk安装教程大佬的github gist页面:https://gist.github.com/assiless/a23fb52e8c6156db0474ee8973c4be66
以及最后的ws-scrcpy搭建的大佬的博客(其实我就是看着这位大佬的教程来搭建,只是中间有点小修改):https://blog.imoeq.com