前言
业务需要大量模拟器场景进行测试,单纯的在windows开模拟器不现实,本想着拉取AOSP源码进行编译然后制作镜像,后来发现开源redroid有现成镜像,于是拿来直接使用并在debian11下成功实现多开
系统版本:debian11
内核:5.10.0-26-amd64
docker 24.0.7
1.方案选择
1.1.方案一k8s集群部署(开源镜像为基础)
测试结论:需要在宿主机上配置binder或BinderFS即可。注意直接用k8s可以直接测通。如果你有自己的构建机以及统一维护的发布系统可以使用这套。(测试通过)
1.2.方案二物理机docker部署发布
测试结论:新物理机 配置docker、binder或BinderFS就可使用。轻量级适合独立维护。(测试通过)
2.环境配置(物理机上执行)
2.1开启binder(只能开启一个模拟器)
1 2 | sudo modprobe binder_linux devices=binder1,binder2,binder3,binder4,binder5,binder6chmod 666 /dev/binder* |
2.2开启BinderFS(可以开启多个模拟器)
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 | # 1.安装必要的工具sudo apt-get updatesudo apt-get install build-essential libncurses5-dev flex bison libssl-dev libelf-dev bc# 2.下载当前Debian内核版本的源代码sudo apt-get source linux-source# 3.进入内核源码目录cd linux-*# 4.配置内核,运行配置工具以启用BinderFS支持。使用 make menuconfig 或 make nconfig:make menuconfig# 出现选项就按这个流程走 General setup -> Pseudo filesystems -> Binder IPC and BinderFS file system 启用这些选项,然后保存并退出# 也可以检查下源码目录下.config文件,并设置一下内容CONFIG_ANDROID_BINDER_IPC=yCONFIG_ANDROID_BINDERFS=yCONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"CONFIG_ANDROID_BINDER_IPC_SELFTEST=y# 5.编译内核make -j$(nproc)# 6.安装新内核sudo make modules_installsudo make install# 7.重新启动sudo reboot |
2.3配置Magisk(android root,如有需要)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #下载magisk 并拆解出libmagisk64.so与libbusybox.somkdir ~/MagiskOnRedroidcd ~/MagiskOnRedroidfind -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# 下载magisk apkif [ ! -f $magisk_file ]; then wget "https://cdn.jsdelivr.net/gh/topjohnwu/magisk-files@1cea72840fbf690f9a95512d03721f6a710fe02e/app-debug.apk"fi# because my machine x64 i will choose x86_64# 解压并提取两个so,根据系统镜像位数来提取unzip -j $magisk_file "lib/x86_64/libmagisk64.so" -d magiskunzip -j $magisk_file "lib/x86_64/libbusybox.so" -d magisk# 重命名mv -v magisk/libmagisk64.so magisk/magiskmv -v magisk/libbusybox.so magisk/busybo# 压缩,将magisk app 和依赖so都放到一起,供后续脚本使用tar --transform 's/.*\///g' -cf ~/magisk.tar --absolute-names $( find ~/MagiskOnRedroid | grep -E "magisk/|app-debug.apk$" ) |
2.3.1.配置magisk所需脚本-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 34 35 36 37 | cat <<\EOF > ~/remove.rcon 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.shservice magisk-d /sbin/magisk --daemon user root oneshoton boot start magisk-don post-fs-data start logd rm /dev/.magisk-unblock start s1 wait /dev/.magisk-unblock 5 rm /dev/.magisk-unblockservice s1 /sbin/magisk --post-fs-data user root oneshotservice s2 /sbin/magisk --service class late_start user root oneshoton property:sys.boot_completed=1 exec /sbin/magisk --boot-completeon property:init.svc.zygote=restarting exec /sbin/magisk --zygote-restarton property:init.svc.zygote=stopped exec /sbin/magisk --zygote-restartEOFsudo chmod 644 ~/remove.rcsudo chown root:root ~/remove.rc |
2.3.2.配置magisk所需脚本-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 41 42 43 44 | cat <<\EOF > ~/setup.sh#!/system/bin/sh# rm /system/fonts/NotoColorEmoji.ttftmpPushed=/magiskrm -rf $tmpPushedmkdir $tmpPushedtar -xvf /magisk.tar --no-same-owner -C $tmpPushedumount /magisk.tar ; rm -v /magisk.tarmkdir /sbinchown root:root /sbin# chmod 0700 /sbinchmod 0751 /sbincp $tmpPushed/magisk /sbin/cp $tmpPushed/app-debug.apk /sbin/stub.apkfind /sbin -type f -exec chmod 0755 {} \;find /sbin -type f -exec chown root:root {} \;# add /sbin# /sbin/# ├── magisk# └── stub.apkln -f -s /sbin/magisk /system/xbin/sumkdir /product/binchmod 751 /product/binln -f -s /sbin/magisk /product/bin/su# add su (override `/system/xbin/su`)# /product/bin/# └── su -> /sbin/magiskmkdir -p /data/adb/magiskchmod 700 /data/adbmv $tmpPushed/busybox /data/adb/magisk/chmod -R 755 /data/adb/magiskchmod -R root:root /data/adb/magisk# /data/adb/# ├── magisk# │ └── busybox# rm -rf $tmpPushedEOFsudo chmod 700 ~/setup.shsudo chown root:root ~/setup.sh |
3.配置文件
3.1.k8s sts.yml
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 | # /dev/binder 如果对内核进行编译ll饿是不需要添加这个apiVersion: apps/v1kind: StatefulSetmetadata: name: redroid11spec: replicas: 1 selector: matchLabels: app: redroid11 serviceName: redroid template: metadata: labels: app: redroid11 spec: terminationGracePeriodSeconds: 0 nodeName: xxxxx.xxxx.xxx.xx containers: - name: redroid image: redroid/redroid:11.0.0-latest securityContext: privileged: true capabilities: add: - SYS_ADMIN volumeMounts: - mountPath: /dev/binder name: binder1 - mountPath: /dev/hwbinder name: binder2 - mountPath: /dev/vndbinder name: binder3 - name: data mountPath: /data readinessProbe: exec: command: - /system/bin/sh - -c - test "1" = "`/system/bin/getprop sys.boot_completed`" initialDelaySeconds: 5 stdin: true tty: true volumes: - name: data emptyDir: {} - name: binder1 hostPath: path: /dev/binder4 - name: binder2 hostPath: path: /dev/binder5 - name: binder3 hostPath: path: /dev/binder6---apiVersion: v1kind: Servicemetadata: name: redroidspec: ports: - port: 5555 targetPort: 5555 selector: app: redroid11 |
3.2.docker启动命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 如果开启BinderFS就不需要挂载/dev/binder了# 开源镜像启动命令docker run -itd --rm --privileged \ -v /dev/binder1:/dev/binder \ -v /dev/binder2:/dev/hwbinder \ -v /dev/binder3:/dev/vndbinder \ # 磁盘挂载,映射安卓存储的路径 -v ~/data11:/data \ -p 5555:5555 \ <镜像名称> # 多启动调整端口即可docker run -itd --rm --privileged \ # 磁盘挂载,映射安卓存储的路径 -v ~/data11:/data \ -p 5556:5555 \ <镜像名称># 需要使用magisk就挂载进去,.rc文件会在系统初始化的时候就加载,并启动magisk服务。 -v ~/remove.rc:/vendor/etc/init/remove.rc \ -v ~/setup.sh:/setup.sh \ -v ~/magisk.tar:/magisk.tar \ |
4.检测
1 2 3 4 5 6 7 8 9 10 | # 本机测试安装apt install adb# 查看设备,端口为启动的端口adb devices或adb connect localhost:5555#安装scrcpy 可视化查看apt install scrcpyscrcpy -s [设备号||localhost:5555]看到以下界面即为成功 |

20240301更新
宿主机如果没有开启网桥,会造成设备无法链接问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #1.先把网桥开起来modprobe bridgeapt-get install bridge-utils#2.调整docker里默认网桥信息*/docker/daemon.json "bridge": "", "bip": "xxx.xxx.xxx.xxx/xx",#3.把docker热重启关闭 "live-restore": false#4.重启docker#5.确认ok后恢复热重启配置live-restore": true |