Featured image of post 安卓Redroid容器化实现指南

安卓Redroid容器化实现指南

本文档详细说明在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
面朝大海,春暖花开。
使用 Hugo 构建
主题 StackJimmy 设计