本文档详细说明在Docker环境下部署Redroid安卓模拟器的完整解决方案,包含非Root/Root两种版本配置、Magisk初始化脚本编写、容器编排文件示例以及设备连接操作指南,并扩展提供iOS/macOS容器化方案的GitHub参考项目。
这篇文章已发布 843 天,部分内容可能已过时。如有疑问,可在评论区留言。
安卓-iOS-macOS Docker
Redroid
非 Root 版本
启动
1
2
3
4
5
6
7
8
9
10
11
12
|
version: "3.0"
services:
redroid_11:
image: redroid/redroid:11.0.0-latest # 安卓 11
container_name: redroid_11
privileged: true
restart: always
ports:
- 5555:5555
volumes:
- ../data/redroid_11:/data
command: ro.secure=0
|
Root 版本
初始化脚本
路径:~/Redroid/MagiskOnRedroid/
需要注意机器的 CPU 架构
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/bin/bash
# 删除旧的文件
rm -rf ./magisk* ./remove.rc ./setup.sh
# 创建一个目录,用于存放 magisk 的文件
if [ ! -d "/root/Redroid/MagiskOnRedroid" ]; then
mkdir ~/Redroid/MagiskOnRedroid
fi
cd ~/Redroid/MagiskOnRedroid
# 下载 magisk 的 apk 文件
find -maxdepth 1 -iname "magisk*" -not -name "*.apk" -exec rm -r {} \;
magisk_file="app-debug.apk"
if [ ! -f $magisk_file ]; then
wget "https://cdn.jsdelivr.net/gh/topjohnwu/magisk-files@1cea72840fbf690f9a95512d03721f6a710fe02e/app-debug.apk"
fi
# 解压 magisk 的 apk 文件:注意机器的架构,这里是 x86_64
unzip -j $magisk_file "lib/x86_64/libmagisk64.so" -d magisk
unzip -j $magisk_file "lib/x86_64/libbusybox.so" -d magisk
mv -v magisk/libmagisk64.so magisk/magisk
mv -v magisk/libbusybox.so magisk/busybox
# 压缩 magisk 的文件
tar --transform 's/.*\///g' -cf ./magisk.tar --absolute-names $( find ~/Redroid/MagiskOnRedroid | grep -E "magisk/|app-debug.apk$" )
# remove.rc
cat <<\EOF > ./remove.rc
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
EOF
sudo chmod 644 ./remove.rc
sudo chown root:root ./remove.rc
# setup.sh
cat <<\EOF > ./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
EOF
sudo chmod 700 ./setup.sh
sudo chown root:root ./setup.sh
|
启动
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
version: "3.0"
services:
redroid_11_magisk:
image: redroid/redroid:11.0.0-latest # 安卓 11
container_name: redroid_11_magisk
privileged: true
restart: always
ports:
- 5555:5555
volumes:
- ../data/redroid_11_magisk:/data
- ../MagiskOnRedroid/remove.rc:/vendor/etc/init/remove.rc
- ../MagiskOnRedroid/setup.sh:/setup.sh
- ../MagiskOnRedroid/magisk.tar:/magisk.tar
command: ro.secure=0
|
连接模拟器
1
2
|
adb connect 172.16.0.101:5555
scrcpy -s 172.16.0.101:5555
|