树莓派 (ARM) 运行 redroid Android Docker
直接回答:可以,而且是最佳方案之一
x86 方案(需要翻译层,有性能损耗和兼容问题):
┌──────────┐ ┌─────────────┐ ┌──────────┐
│ ARM .so │ → │ houdini/ndk │ → │ x86 CPU │
│ │ │ 翻译层(慢) │ │ │
└──────────┘ └─────────────┘ └──────────┘
ARM 树莓派方案(原生执行,无损耗):
┌──────────┐ ┌──────────┐
│ ARM .so │ → │ ARM CPU │ ← 直接运行,无需翻译
│ │ │ (树莓派) │
└──────────┘ └──────────┘
ARM 架构完全匹配,不需要任何翻译层,兼容性和性能都远优于 x86 方案。
架构匹配关系
| APK 中的 .so 架构 | 树莓派 ARM64 CPU | 是否原生支持 |
|---|---|---|
arm64-v8a |
aarch64 | ✅ 完美原生 |
armeabi-v7a |
aarch64 向下兼容 | ✅ 原生兼容 |
armeabi |
aarch64 向下兼容 | ✅ 原生兼容 |
x86_64 |
— | ❌ 不支持 |
x86 |
— | ❌ 不支持 |
99%+ 的 Android 应用都提供 ARM 架构的 .so,所以几乎所有 APK 都能运行。
完整部署指南
第一步:准备树莓派
# 推荐配置
# - 树莓派 4 (4GB/8GB) 或 树莓派 5 (8GB)
# - 64位系统(必须)
# - SSD 启动(强烈推荐,SD卡太慢)
# 确认架构
uname -m
# 输出: aarch64 ← 必须是这个
# 确认64位系统
getconf LONG_BIT
# 输出: 64
# 系统推荐: Ubuntu Server 22.04/24.04 LTS (arm64)
# 或 Raspberry Pi OS 64-bit (Lite)
第二步:编译支持 binder 的内核
方案 A:树莓派 OS — 编译内核模块
# 安装依赖
sudo apt update && sudo apt install -y \
git bc bison flex libssl-dev make libncurses-dev \
raspberrypi-kernel-headers
# 获取内核源码
sudo apt install -y linux-source || \
git clone --depth 1 \
https://github.com/raspberrypi/linux.git \
-b rpi-6.6.y \
~/rpi-kernel
cd ~/rpi-kernel
# 加载当前配置
sudo modprobe configs 2>/dev/null
zcat /proc/config.gz > .config 2>/dev/null || \
cp /boot/config-$(uname -r) .config 2>/dev/null || \
make bcm2711_defconfig # RPi 4
# 启用 binder 和 ashmem
cat >> .config << 'EOF'
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
CONFIG_ASHMEM=y
CONFIG_STAGING=y
CONFIG_PSI=y
EOF
make olddefconfig
# 编译(树莓派上比较慢,约1-3小时)
make -j$(nproc)
sudo make modules_install
sudo make install
# 更新引导
sudo cp arch/arm64/boot/Image /boot/kernel8.img
sudo reboot
方案 B:Ubuntu Server — 使用 DKMS 模块(更简单)
# Ubuntu 有些版本已内置 binder 支持,先检查
grep -i binder /proc/filesystems
# 如果有输出就不需要编译
# 如果没有,尝试加载模块
sudo modprobe binder_linux
sudo modprobe ashmem_linux
# 如果模块不存在,安装 anbox 的 DKMS 模块
sudo add-apt-repository ppa:morphis/anbox-support
sudo apt update
sudo apt install -y linux-modules-extra-$(uname -r) anbox-modules-dkms
sudo modprobe binder_linux
sudo modprobe ashmem_linux
# 开机自动加载
echo "binder_linux" | sudo tee /etc/modules-load.d/binder.conf
echo "ashmem_linux" | sudo tee /etc/modules-load.d/ashmem.conf
验证 binder
# 必须看到 binder
grep binder /proc/filesystems
# 输出: nodev binder
# 挂载 binderfs
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs
echo "binder /dev/binderfs binder defaults 0 0" | sudo tee -a /etc/fstab
ls /dev/binderfs/
第三步:安装 Docker
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker
# 验证
docker run --rm hello-world
第四步:运行 redroid (ARM 版)
# 关键:使用 ARM64 架构的 redroid 镜像
docker run -d --name redroid \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid/redroid:12.0.0-latest \
androidboot.redroid_gpu_mode=guest \
androidboot.redroid_fps=30 \
androidboot.redroid_width=720 \
androidboot.redroid_height=1280 \
androidboot.redroid_dpi=320 \
ro.debuggable=1 \
ro.secure=0 \
ro.adb.secure=0
Docker 会自动拉取
linux/arm64架构的镜像,不需要手动指定--platform。
# 等待启动(首次较慢,约1-2分钟)
docker logs -f redroid
# 看到类似 "Boot completed" 后连接
adb connect localhost:5555
adb devices
第五步:验证 ARM 原生支持
adb shell getprop ro.product.cpu.abilist
# 输出: arm64-v8a,armeabi-v7a,armeabi
# ↑ 全是 ARM 架构,原生支持!
adb shell getprop ro.product.cpu.abi
# 输出: arm64-v8a
adb shell getprop ro.dalvik.vm.native.bridge
# 输出: 0 (或空)
# ↑ 不需要翻译层!
第六步:安装 Magisk
# 下载 ARM 版 Magisk(这里天然兼容)
wget https://github.com/topjohnwu/Magisk/releases/download/v27.0/Magisk-v27.0.apk
adb install Magisk-v27.0.apk
# 打开 Magisk 完成初始设置
adb shell am start -n com.topjohnwu.magisk/.ui.MainActivity
第七步:安装 LSPosed
# 1. 先在 Magisk 设置中启用 Zygisk,重启容器
docker restart redroid && sleep 60 && adb connect localhost:5555
# 2. 下载 LSPosed
wget https://github.com/LSPosed/LSPosed/releases/download/v1.9.2/LSPosed-v1.9.2-7024-zygisk-release.zip
# 3. 推送并安装
adb push LSPosed-v1.9.2-7024-zygisk-release.zip /sdcard/
# 4. Magisk App → 模块 → 从本地安装 → 选择 zip
# 5. 重启
docker restart redroid
性能优化(树莓派专用)
# /boot/config.txt 或 /boot/firmware/config.txt
# 添加以下内容提升性能
# 超频 (RPi 4, 请确保散热良好)
over_voltage=6
arm_freq=2000
gpu_freq=750
# 分配更多 GPU 内存
gpu_mem=256
# 启用 64位模式
arm_64bit=1
# Docker 资源限制建议 (8GB RPi)
docker run -d --name redroid \
--privileged \
--memory=4g \
--cpus=3 \
-v ~/redroid-data:/data \
--tmpfs /cache:rw,size=256m \
-p 5555:5555 \
redroid/redroid:12.0.0-latest \
androidboot.redroid_gpu_mode=guest \
androidboot.redroid_fps=30 \
androidboot.redroid_width=720 \
androidboot.redroid_height=1280 \
androidboot.redroid_dpi=240
存储优化
# 强烈建议使用 USB SSD 而不是 SD 卡
# SD 卡随机读写极慢,Android 会卡顿严重
# 将 Docker 数据目录移到 SSD
sudo systemctl stop docker
sudo mv /var/lib/docker /mnt/ssd/docker
sudo ln -s /mnt/ssd/docker /var/lib/docker
sudo systemctl start docker
x86 vs ARM 方案对比
┌─────────────────┬──────────────────────┬──────────────────────┐
│ │ x86 Windows + WSL2 │ ARM 树莓派 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ ARM .so 兼容性 │ ⚠️ 需要翻译层 │ ✅ 原生 100% 兼容 │
│ │ ~80% 兼容率 │ │
├─────────────────┼──────────────────────┼──────────────────────┤
│ 性能损耗 │ 翻译层 30-50% 损耗 │ ✅ 零损耗 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ 配置复杂度 │ ⭐⭐⭐⭐⭐ 非常复杂 │ ⭐⭐⭐ 中等 │
│ │ 需编译内核+翻译层 │ 仅需编译内核 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ CPU 性能 │ ✅ 强 (i7/Ryzen) │ ⚠️ 较弱 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ 适合场景 │ 开发调试 │ 7×24 挂机/自动化 │
│ │ 临时使用 │ 低功耗服务器 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ 功耗 │ 65-150W │ ✅ 5-15W │
├─────────────────┼──────────────────────┼──────────────────────┤
│ 成本 │ 已有电脑则 $0 │ RPi5 8GB ≈ $80 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ Magisk/LSPosed │ ✅ 支持 │ ✅ 支持 │
├─────────────────┼──────────────────────┼──────────────────────┤
│ 游戏/重型APP │ ✅ CPU够强但翻译有问题 │ ⚠️ CPU可能不够 │
└─────────────────┴──────────────────────┴──────────────────────┘
结论:如果你的目标是运行包含 ARM .so 的 APK,树莓派方案在兼容性上远胜 x86,是更正确的架构选择。 唯一的代价是 CPU 算力较弱,不适合跑大型游戏或计算密集型应用,但对于自动化、挂机、轻量应用完全足够。
在 x86 Windows 上运行 Android Docker (redroid) 完整指南
整体架构
┌──────────────────────────────────────────────────┐
│ Windows x86_64 Host │
│ ┌────────────────────────────────────────────┐ │
│ │ WSL2 (自定义内核: binder/ashmem) │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ Docker Engine │ │ │
│ │ │ ┌────────────────────────────────┐ │ │ │
│ │ │ │ redroid Container (Android) │ │ │ │
│ │ │ │ ┌──────────────────────────┐ │ │ │ │
│ │ │ │ │ ARM Translation (houdini)│ │ │ │ │
│ │ │ │ │ Magisk (Root) │ │ │ │ │
│ │ │ │ │ LSPosed (Xposed) │ │ │ │ │
│ │ │ │ └──────────────────────────┘ │ │ │ │
│ │ │ └────────────────────────────────┘ │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
第一部分:编译自定义 WSL2 内核
redroid 需要 Linux 内核中的
binder和ashmem模块,WSL2 默认内核不包含。
1.1 安装编译依赖
# 在 WSL2 (Ubuntu) 中执行
sudo apt update && sudo apt install -y \
build-essential flex bison libssl-dev libelf-dev \
bc python3 pahole dwarves git wget
1.2 获取 WSL2 内核源码
# 查看当前内核版本
uname -r
# 输出类似: 5.15.153.1-microsoft-standard-WSL2# 克隆对应版本的内核源码
git clone --depth 1 \
https://github.com/microsoft/WSL2-Linux-Kernel.git \
-b linux-msft-wsl-5.15.y \
~/wsl2-kernelcd ~/wsl2-kernel
1.3 修改内核配置
# 以默认 WSL2 配置为基础
cp Microsoft/config-wsl .config# 使用 menuconfig 或直接追加配置
cat >> .config << 'EOF'
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
CONFIG_ANDROID_BINDER_IPC_SELFTEST=n
CONFIG_ASHMEM=y
CONFIG_STAGING=y
CONFIG_PSI=y
CONFIG_PSI_DEFAULT_DISABLED=n
EOF# 更新配置(接受默认值)
make olddefconfig
1.4 编译内核
# -j$(nproc) 使用所有CPU核心编译
make -j$(nproc)# 编译完成后,内核文件在:
ls -la arch/x86/boot/bzImage
1.5 安装自定义内核
# 复制到 Windows 用户目录
cp arch/x86/boot/bzImage /mnt/c/Users/<你的用户名>/wsl2-kernel
在 Windows 中创建/编辑 C:\Users\<你的用户名>\.wslconfig:
[wsl2]
kernel=C:\\Users\\<你的用户名>\\wsl2-kernel
memory=8GB
processors=4
# 在 PowerShell 中重启 WSL2
wsl --shutdown
wsl
1.6 验证内核模块
# 重新进入 WSL2 后验证
uname -r # 应该显示你编译的版本# 检查 binder 支持
grep -i binder /proc/filesystems
# 应该输出: nodev binder# 挂载 binderfs
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs# 写入 fstab 使其开机自动挂载
echo "binder /dev/binderfs binder defaults 0 0" | sudo tee -a /etc/fstab
第二部分:Docker 环境搭建
2.1 方案 A:WSL2 内原生 Docker(推荐)
# 安装 Docker Engine (不需要 Docker Desktop)
curl -fsSL https://get.docker.com | sudo sh# 启动 Docker
sudo service docker start# 添加当前用户到 docker 组
sudo usermod -aG docker $USER
newgrp docker
2.2 方案 B:Docker Desktop
安装 Docker Desktop for Windows,启用 WSL2 后端,并确保使用自定义内核的 WSL2 发行版。
⚠️ 注意:Docker Desktop 可能使用自己的 WSL2 发行版,不含自定义内核模块。推荐方案 A。
第三部分:redroid 基础运行
3.1 基础运行测试
docker run -d --name redroid-test \
--privileged \
--pull always \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid/redroid:12.0.0-latest \
androidboot.redroid_gpu_mode=guest
# 验证容器是否正常运行
docker logs -f redroid-test
# 等待看到 "Boot completed" 类似信息# ADB 连接
adb connect localhost:5555
adb devices
第四部分:ARM 翻译层集成
这是让 x86 的 Android 容器运行 ARM 架构 .so 文件的关键。
4.1 方案选择
| 方案 | 来源 | 兼容性 | 推荐度 |
|---|---|---|---|
| libndk_translation | Google (AOSP) | 较好 | ⭐⭐⭐⭐⭐ |
| libhoudini | Intel (提取) | 好 | ⭐⭐⭐⭐ |
4.2 使用 Dockerfile 构建含 ARM 翻译的镜像
创建工作目录:
mkdir -p ~/redroid-build && cd ~/redroid-build
4.2.1 获取 libndk_translation
# 从 Google Android Emulator 系统镜像中提取
# 下载 Android 12 x86_64 系统镜像 (包含 ndk_translation)
mkdir -p ndk_translation# 方法1:使用社区提取的包(更方便)
# 在 GitHub 上搜索 "redroid ndk_translation" 或 "redroid-arm"
# 例如: https://github.com/nicknisi/redroid-arm 等类似项目# 方法2:从 Android SDK 提取
# sdkmanager "system-images;android-31;google_apis;x86_64"
# 然后从系统镜像中提取 /system/lib64/libndk_translation.so 等文件
4.2.2 创建 Dockerfile
# ~/redroid-build/Dockerfile
FROM redroid/redroid:12.0.0-latest# 复制 ARM 翻译库
COPY ndk_translation/ /system/# 设置 ARM 翻译层属性
RUN echo "persist.sys.nativebridge=1" >> /system/build.prop && \
echo "ro.enable.native.bridge.exec=1" >> /system/build.prop && \
echo "ro.dalvik.vm.native.bridge=libndk_translation.so" >> /system/build.prop && \
echo "ro.ndk_translation.version=0.2.2" >> /system/build.prop
4.2.3 更简便的方式 — 使用社区预构建脚本
# 克隆社区维护的 redroid ARM 翻译项目
git clone https://github.com/redroid-rockchip/redroid-arm-builder.git
cd redroid-arm-builder# 或者使用这个更活跃的项目
git clone https://github.com/nicknisi/redroid-arm.git
cd redroid-arm# 按照项目 README 构建
# 通常是: ./build.sh 或 docker build
4.2.4 最简方式 — 直接使用支持 ARM 的社区镜像
# 一些社区维护的预构建镜像(需要自行验证可用性)
# 格式: docker pull <image># 搜索 Docker Hub 上的 redroid 镜像
docker search redroid
4.3 运行带 ARM 翻译的容器
docker run -d --name redroid-arm \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid-with-ndk:12.0.0 \
androidboot.redroid_gpu_mode=guest \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.native.bridge=libndk_translation.so
4.4 验证 ARM 翻译
adb connect localhost:5555
adb shell getprop ro.product.cpu.abilist
# 应输出: x86_64,arm64-v8a,x86,armeabi-v7a,armeabiadb shell getprop ro.dalvik.vm.native.bridge
# 应输出: libndk_translation.so
第五部分:Magisk 集成
5.1 方案 A:运行时安装(推荐)
# 下载 Magisk APK
wget https://github.com/topjohnwu/Magisk/releases/download/v27.0/Magisk-v27.0.apk \
-O Magisk.apk# 连接 ADB
adb connect localhost:5555# 安装 Magisk
adb install Magisk.apk
5.2 方案 B:构建含 Magisk 的镜像(更稳定)
创建 Magisk 集成脚本:
#!/bin/bash
# ~/redroid-build/integrate-magisk.shset -eMAGISK_VERSION="27.0"
MAGISK_APK="Magisk-v${MAGISK_VERSION}.apk"
WORKDIR=$(mktemp -d)echo "[*] 下载 Magisk..."
wget -q "https://github.com/topjohnwu/Magisk/releases/download/v${MAGISK_VERSION}/${MAGISK_APK}" \
-O "${WORKDIR}/${MAGISK_APK}"echo "[*] 解压 Magisk..."
cd "${WORKDIR}"
unzip -q "${MAGISK_APK}" -d magisk_extractedecho "[*] 准备 Magisk 文件..."
mkdir -p magisk_overlay/system/app/Magisk
cp "${MAGISK_APK}" magisk_overlay/system/app/Magisk/Magisk.apk# 提取 native 库
mkdir -p magisk_overlay/system/lib64
unzip -q "${MAGISK_APK}" 'lib/x86_64/*' -d tmp_libs 2>/dev/null || \
unzip -q "${MAGISK_APK}" 'lib/x86/*' -d tmp_libs 2>/dev/nullecho "[*] Magisk 文件准备完成: ${WORKDIR}/magisk_overlay/"
echo "[*] 将此目录挂载到 redroid 容器中"
5.3 使用 Magisk Delta 或 KernelSU on Docker
对于 redroid,更实用的方式是使用修改后的 init 流程:
# Dockerfile.magisk
FROM redroid-with-ndk:12.0.0# 复制 Magisk 二进制文件到系统分区
COPY magisk_files/magiskinit /system/bin/magiskinit
COPY magisk_files/magisk64 /system/bin/magisk64
COPY magisk_files/magisk32 /system/bin/magisk32
COPY magisk_files/busybox /system/bin/busybox_magiskRUN chmod 755 /system/bin/magiskinit \
/system/bin/magisk64 \
/system/bin/magisk32 \
/system/bin/busybox_magisk# Magisk 的 init overlay
COPY magisk_overlay/ /system/
5.4 更实际的做法:直接在运行中的容器里 Patch
# 1. 启动 redroid 容器
docker run -d --name redroid \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid-with-ndk:12.0.0 \
androidboot.redroid_gpu_mode=guest \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.native.bridge=libndk_translation.so \
ro.debuggable=1 \
ro.secure=0 \
ro.adb.secure=0# 2. 等待启动完成
sleep 30# 3. 连接 ADB
adb connect localhost:5555# 4. 安装 Magisk Manager
adb install Magisk-v27.0.apk# 5. 进入容器 Shell 执行 Root 操作
docker exec -it redroid sh# 在容器内:
# Magisk 通常需要 patch boot.img,但 redroid 没有传统 boot 分区
# 需要使用 "Direct Install (Recommended)" 方式
# 或者使用以下脚本模拟
5.5 使用 redroid-magisk 项目(最推荐)
# 这是专门为 redroid 适配 Magisk 的项目
git clone https://github.com/nicknisi/redroid-magisk.git
# 或搜索类似的适配项目:
# https://github.com/nicknisi/redroid-magisk
# https://github.com/nicknisi/redroidcd redroid-magisk# 按项目说明构建
docker build -t redroid-magisk:12.0.0 .
第六部分:LSPosed 安装
6.1 前提条件
- ✅ Magisk 已正常运行
- ✅ Zygisk 已在 Magisk 设置中启用
6.2 安装步骤
# 1. 下载 LSPosed (Zygisk 版本)
wget https://github.com/LSPosed/LSPosed/releases/download/v1.9.2/LSPosed-v1.9.2-7024-zygisk-release.zip \
-O LSPosed.zip# 2. 推送到设备
adb connect localhost:5555
adb push LSPosed.zip /sdcard/# 3. 通过 Magisk Manager 安装模块
# - 打开 Magisk App
# - 底部导航 → 模块
# - 从存储安装 → 选择 LSPosed.zip
# - 安装完成后重启# 4. 重启容器
docker restart redroid
# 等待约30秒# 5. 验证
adb connect localhost:5555
adb shell
# 在 shell 中检查 LSPosed 是否运行
ls /data/adb/modules/zygisk_lsposed/
6.3 LSPosed Manager
# LSPosed Manager 安装后会自动创建通知快捷方式
# 也可以通过以下命令手动启动
adb shell am start -n \
org.lsposed.manager/.ui.activity.MainActivity# 或者安装独立的 LSPosed Manager APK
# (从 LSPosed releases 下载 manager.apk)
adb install LSPosed-manager.apk
第七部分:远程显示 & 交互
7.1 scrcpy(推荐)
# Windows 上安装 scrcpy
# 下载: https://github.com/Genymobile/scrcpy/releases
# 或通过 winget:
winget install Genymobile.scrcpy# 连接并显示
adb connect localhost:5555
scrcpy -s localhost:5555
7.2 redroid 自带 VNC
# 启动时添加 VNC 端口映射
docker run -d --name redroid \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
-p 5900:5900 \
redroid-with-ndk:12.0.0 \
androidboot.redroid_gpu_mode=guest \
# ... 其他参数
7.3 Web 浏览器访问(ws-scrcpy)
# 部署 ws-scrcpy 实现浏览器访问
docker run -d --name ws-scrcpy \
-p 8000:8000 \
--link redroid:redroid \
nicknisi/ws-scrcpy:latest# 浏览器访问: http://localhost:8000
第八部分:完整的 Docker Compose 配置
# ~/redroid-project/docker-compose.yml
version: "3.8"services:
redroid:
image: redroid-custom:12.0.0 # 你构建的包含ARM翻译+Magisk的镜像
container_name: redroid
privileged: true
ports:
- "5555:5555" # ADB
- "5900:5900" # VNC (可选)
volumes:
- redroid-data:/data
command:
- androidboot.redroid_gpu_mode=guest
- androidboot.redroid_fps=60
- androidboot.redroid_width=1080
- androidboot.redroid_height=1920
- androidboot.redroid_dpi=480
- ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi
- ro.product.cpu.abilist64=x86_64,arm64-v8a
- ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
- ro.dalvik.vm.native.bridge=libndk_translation.so
- ro.debuggable=1
- ro.secure=0
- ro.adb.secure=0
deploy:
resources:
limits:
memory: 4G
cpus: "4"
restart: unless-stoppedvolumes:
redroid-data:
driver: local
docker compose up -d
第九部分:一键自动化脚本
#!/bin/bash
# ~/redroid-project/setup-all.sh
# 一键部署 redroid + ARM翻译 + Magisk + LSPosedset -eRED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'WORKDIR=~/redroid-project
ANDROID_VERSION="12.0.0"
MAGISK_VERSION="27.0"
LSPOSED_VERSION="1.9.2"
ADB_PORT=5555log() { echo -e "${GREEN}[✓]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
err() { echo -e "${RED}[✗]${NC} $1"; exit 1; }# ============ 环境检查 ============
check_env() {
log "检查环境..." # 检查 binder 支持
if ! grep -q binder /proc/filesystems 2>/dev/null; then
err "内核不支持 binder!请先编译自定义 WSL2 内核(参见第一部分)"
fi # 检查 Docker
if ! command -v docker &>/dev/null; then
err "Docker 未安装!"
fi # 检查 ADB
if ! command -v adb &>/dev/null; then
warn "ADB 未安装,正在安装..."
sudo apt install -y android-tools-adb
fi # 挂载 binderfs
if ! mountpoint -q /dev/binderfs 2>/dev/null; then
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs
log "已挂载 binderfs"
fi log "环境检查通过 ✓"
}# ============ 构建镜像 ============
build_image() {
log "构建 redroid 镜像(含 ARM 翻译)..." mkdir -p ${WORKDIR}/build && cd ${WORKDIR}/build # 创建 Dockerfile
cat > Dockerfile << 'DOCKERFILE'
FROM redroid/redroid:12.0.0-latest# 注意:实际使用时需要将 ARM 翻译文件放入 ndk_translation 目录
# COPY ndk_translation/ /system/# 设置属性
RUN echo "persist.sys.nativebridge=1" >> /system/build.prop && \
echo "ro.enable.native.bridge.exec=1" >> /system/build.prop && \
echo "ro.dalvik.vm.native.bridge=libndk_translation.so" >> /system/build.prop
DOCKERFILE # 如果有 ARM 翻译文件则构建自定义镜像
if [ -d "ndk_translation" ]; then
docker build -t redroid-custom:${ANDROID_VERSION} .
log "自定义镜像构建完成"
else
warn "未找到 ARM 翻译文件,使用基础镜像"
docker tag redroid/redroid:${ANDROID_VERSION}-latest redroid-custom:${ANDROID_VERSION}
fi
}# ============ 启动容器 ============
start_redroid() {
log "启动 redroid 容器..." # 停止旧容器
docker rm -f redroid 2>/dev/null || true docker run -d --name redroid \
--privileged \
-v ${WORKDIR}/data:/data \
-p ${ADB_PORT}:5555 \
redroid-custom:${ANDROID_VERSION} \
androidboot.redroid_gpu_mode=guest \
androidboot.redroid_fps=60 \
androidboot.redroid_width=1080 \
androidboot.redroid_height=1920 \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.native.bridge=libndk_translation.so \
ro.debuggable=1 \
ro.secure=0 \
ro.adb.secure=0 log "等待 Android 启动..."
sleep 45 # 连接 ADB
adb disconnect localhost:${ADB_PORT} 2>/dev/null || true
adb connect localhost:${ADB_PORT} # 等待设备就绪
adb -s localhost:${ADB_PORT} wait-for-device
log "Android 已启动 ✓"
}# ============ 安装 Magisk ============
install_magisk() {
log "安装 Magisk v${MAGISK_VERSION}..." cd ${WORKDIR} # 下载 Magisk
if [ ! -f "Magisk-v${MAGISK_VERSION}.apk" ]; then
wget -q "https://github.com/topjohnwu/Magisk/releases/download/v${MAGISK_VERSION}/Magisk-v${MAGISK_VERSION}.apk"
fi # 安装
adb -s localhost:${ADB_PORT} install -r "Magisk-v${MAGISK_VERSION}.apk" log "Magisk 已安装 ✓"
warn "请手动打开 Magisk App 完成初始化设置,然后启用 Zygisk"
}# ============ 安装 LSPosed ============
install_lsposed() {
log "安装 LSPosed v${LSPOSED_VERSION}..." cd ${WORKDIR} # 下载 LSPosed
if [ ! -f "LSPosed-v${LSPOSED_VERSION}.zip" ]; then
wget -q "https://github.com/LSPosed/LSPosed/releases/download/v${LSPOSED_VERSION}/LSPosed-v${LSPOSED_VERSION}-7024-zygisk-release.zip" \
-O "LSPosed-v${LSPOSED_VERSION}.zip"
fi # 推送到设备
adb -s localhost:${ADB_PORT} push "LSPosed-v${LSPOSED_VERSION}.zip" /sdcard/ log "LSPosed 模块已推送到 /sdcard/"
warn "请在 Magisk App 中: 模块 → 从本地安装 → 选择 LSPosed zip → 重启"
}# ============ 主流程 ============
main() {
echo "================================================"
echo " redroid 全功能部署脚本"
echo " Android ${ANDROID_VERSION} + ARM翻译 + Magisk + LSPosed"
echo "================================================"
echo "" check_env
build_image
start_redroid
install_magisk echo ""
warn "=== 手动步骤 ==="
echo "1. 使用 scrcpy 连接: scrcpy -s localhost:${ADB_PORT}"
echo "2. 打开 Magisk App → 设置 → 启用 Zygisk → 重启"
echo "3. 重启后运行: $0 --lsposed 安装 LSPosed"
echo "4. 在 Magisk 中安装 LSPosed 模块 → 重启"
echo ""
log "部署完成!🎉"
}# 参数处理
case "${1}" in
--lsposed)
install_lsposed
;;
--restart)
docker restart redroid
sleep 30
adb connect localhost:${ADB_PORT}
;;
*)
main
;;
esac
chmod +x setup-all.sh
./setup-all.sh
常见问题排查
Q1: 容器启动失败 — binder: Failed to open
# 确认 binder 模块加载
grep binder /proc/filesystems
# 如果没有输出,说明内核不支持# 解决: 重新编译内核(第一部分)
# 或加载模块
sudo modprobe binder_linux
sudo modprobe ashmem_linux
Q2: ARM 应用闪退
# 检查 native bridge 是否生效
adb shell getprop ro.dalvik.vm.native.bridge
# 应返回 libndk_translation.so 或 libhoudini.so# 检查支持的 ABI
adb shell getprop ro.product.cpu.abilist
# 应包含 arm64-v8a, armeabi-v7a# 查看 crash log
adb logcat | grep -E "(FATAL|crash|native.bridge)"
Q3: Magisk 无法获取 Root
# redroid 默认以 root 运行,但 Magisk 需要额外设置
# 在容器内检查
adb shell id
# uid=0(root) 表示已有 root# 如果 Magisk 不识别,尝试:
adb shell setprop ro.debuggable 1
adb shell setprop ro.secure 0
Q4: 性能优化
# 1. 分配更多资源
docker update --memory=8g --cpus=6 redroid# 2. 使用 virtio-gpu (如果宿主支持)
# 替换 androidboot.redroid_gpu_mode=guest 为:
# androidboot.redroid_gpu_mode=host# 3. 使用 tmpfs 加速 /data
docker run ... --tmpfs /cache:rw,size=512m ...
备选方案对比
| 方案 | ARM 翻译 | Magisk | LSPosed | 难度 | Docker |
|---|---|---|---|---|---|
| redroid (本文) | ✅ | ✅ | ✅ | ⭐⭐⭐⭐⭐ | ✅ |
| Genymotion | ✅ | ✅ | ✅ | ⭐⭐ | ❌ |
| Android Studio AVD | ✅ | ⚠️ | ⚠️ | ⭐⭐⭐ | ❌ |
| WSA (已停止) | ✅ | ✅ | ✅ | ⭐⭐ | ❌ |
| Waydroid (Linux) | ✅ | ✅ | ✅ | ⭐⭐⭐ | ❌ |
如果不强制要求 Docker,Genymotion 或带 Magisk 补丁的 Android Studio Emulator 是更简单的选择。redroid 的优势在于可以批量部署、CI/CD 集成和云原生场景。
在 x86 Windows 上运行 Android Docker (redroid) 完整指南
整体架构
┌──────────────────────────────────────────────────┐
│ Windows x86_64 Host │
│ ┌────────────────────────────────────────────┐ │
│ │ WSL2 (自定义内核: binder/ashmem) │ │
│ │ ┌──────────────────────────────────────┐ │ │
│ │ │ Docker Engine │ │ │
│ │ │ ┌────────────────────────────────┐ │ │ │
│ │ │ │ redroid Container (Android) │ │ │ │
│ │ │ │ ┌──────────────────────────┐ │ │ │ │
│ │ │ │ │ ARM Translation (houdini)│ │ │ │ │
│ │ │ │ │ Magisk (Root) │ │ │ │ │
│ │ │ │ │ LSPosed (Xposed) │ │ │ │ │
│ │ │ │ └──────────────────────────┘ │ │ │ │
│ │ │ └────────────────────────────────┘ │ │ │
│ │ └──────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
第一部分:编译自定义 WSL2 内核
redroid 需要 Linux 内核中的
binder和ashmem模块,WSL2 默认内核不包含。
1.1 安装编译依赖
# 在 WSL2 (Ubuntu) 中执行
sudo apt update && sudo apt install -y \
build-essential flex bison libssl-dev libelf-dev \
bc python3 pahole dwarves git wget
1.2 获取 WSL2 内核源码
# 查看当前内核版本
uname -r
# 输出类似: 5.15.153.1-microsoft-standard-WSL2# 克隆对应版本的内核源码
git clone --depth 1 \
https://github.com/microsoft/WSL2-Linux-Kernel.git \
-b linux-msft-wsl-5.15.y \
~/wsl2-kernelcd ~/wsl2-kernel
1.3 修改内核配置
# 以默认 WSL2 配置为基础
cp Microsoft/config-wsl .config# 使用 menuconfig 或直接追加配置
cat >> .config << 'EOF'
CONFIG_ANDROID=y
CONFIG_ANDROID_BINDER_IPC=y
CONFIG_ANDROID_BINDERFS=y
CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder"
CONFIG_ANDROID_BINDER_IPC_SELFTEST=n
CONFIG_ASHMEM=y
CONFIG_STAGING=y
CONFIG_PSI=y
CONFIG_PSI_DEFAULT_DISABLED=n
EOF# 更新配置(接受默认值)
make olddefconfig
1.4 编译内核
# -j$(nproc) 使用所有CPU核心编译
make -j$(nproc)# 编译完成后,内核文件在:
ls -la arch/x86/boot/bzImage
1.5 安装自定义内核
# 复制到 Windows 用户目录
cp arch/x86/boot/bzImage /mnt/c/Users/<你的用户名>/wsl2-kernel
在 Windows 中创建/编辑 C:\Users\<你的用户名>\.wslconfig:
[wsl2]
kernel=C:\\Users\\<你的用户名>\\wsl2-kernel
memory=8GB
processors=4
# 在 PowerShell 中重启 WSL2
wsl --shutdown
wsl
1.6 验证内核模块
# 重新进入 WSL2 后验证
uname -r # 应该显示你编译的版本# 检查 binder 支持
grep -i binder /proc/filesystems
# 应该输出: nodev binder# 挂载 binderfs
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs# 写入 fstab 使其开机自动挂载
echo "binder /dev/binderfs binder defaults 0 0" | sudo tee -a /etc/fstab
第二部分:Docker 环境搭建
2.1 方案 A:WSL2 内原生 Docker(推荐)
# 安装 Docker Engine (不需要 Docker Desktop)
curl -fsSL https://get.docker.com | sudo sh# 启动 Docker
sudo service docker start# 添加当前用户到 docker 组
sudo usermod -aG docker $USER
newgrp docker
2.2 方案 B:Docker Desktop
安装 Docker Desktop for Windows,启用 WSL2 后端,并确保使用自定义内核的 WSL2 发行版。
⚠️ 注意:Docker Desktop 可能使用自己的 WSL2 发行版,不含自定义内核模块。推荐方案 A。
第三部分:redroid 基础运行
3.1 基础运行测试
docker run -d --name redroid-test \
--privileged \
--pull always \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid/redroid:12.0.0-latest \
androidboot.redroid_gpu_mode=guest
# 验证容器是否正常运行
docker logs -f redroid-test
# 等待看到 "Boot completed" 类似信息# ADB 连接
adb connect localhost:5555
adb devices
第四部分:ARM 翻译层集成
这是让 x86 的 Android 容器运行 ARM 架构 .so 文件的关键。
4.1 方案选择
| 方案 | 来源 | 兼容性 | 推荐度 |
|---|---|---|---|
| libndk_translation | Google (AOSP) | 较好 | ⭐⭐⭐⭐⭐ |
| libhoudini | Intel (提取) | 好 | ⭐⭐⭐⭐ |
4.2 使用 Dockerfile 构建含 ARM 翻译的镜像
创建工作目录:
mkdir -p ~/redroid-build && cd ~/redroid-build
4.2.1 获取 libndk_translation
# 从 Google Android Emulator 系统镜像中提取
# 下载 Android 12 x86_64 系统镜像 (包含 ndk_translation)
mkdir -p ndk_translation# 方法1:使用社区提取的包(更方便)
# 在 GitHub 上搜索 "redroid ndk_translation" 或 "redroid-arm"
# 例如: https://github.com/nicknisi/redroid-arm 等类似项目# 方法2:从 Android SDK 提取
# sdkmanager "system-images;android-31;google_apis;x86_64"
# 然后从系统镜像中提取 /system/lib64/libndk_translation.so 等文件
4.2.2 创建 Dockerfile
# ~/redroid-build/Dockerfile
FROM redroid/redroid:12.0.0-latest# 复制 ARM 翻译库
COPY ndk_translation/ /system/# 设置 ARM 翻译层属性
RUN echo "persist.sys.nativebridge=1" >> /system/build.prop && \
echo "ro.enable.native.bridge.exec=1" >> /system/build.prop && \
echo "ro.dalvik.vm.native.bridge=libndk_translation.so" >> /system/build.prop && \
echo "ro.ndk_translation.version=0.2.2" >> /system/build.prop
4.2.3 更简便的方式 — 使用社区预构建脚本
# 克隆社区维护的 redroid ARM 翻译项目
git clone https://github.com/redroid-rockchip/redroid-arm-builder.git
cd redroid-arm-builder# 或者使用这个更活跃的项目
git clone https://github.com/nicknisi/redroid-arm.git
cd redroid-arm# 按照项目 README 构建
# 通常是: ./build.sh 或 docker build
4.2.4 最简方式 — 直接使用支持 ARM 的社区镜像
# 一些社区维护的预构建镜像(需要自行验证可用性)
# 格式: docker pull <image># 搜索 Docker Hub 上的 redroid 镜像
docker search redroid
4.3 运行带 ARM 翻译的容器
docker run -d --name redroid-arm \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid-with-ndk:12.0.0 \
androidboot.redroid_gpu_mode=guest \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.native.bridge=libndk_translation.so
4.4 验证 ARM 翻译
adb connect localhost:5555
adb shell getprop ro.product.cpu.abilist
# 应输出: x86_64,arm64-v8a,x86,armeabi-v7a,armeabiadb shell getprop ro.dalvik.vm.native.bridge
# 应输出: libndk_translation.so
第五部分:Magisk 集成
5.1 方案 A:运行时安装(推荐)
# 下载 Magisk APK
wget https://github.com/topjohnwu/Magisk/releases/download/v27.0/Magisk-v27.0.apk \
-O Magisk.apk# 连接 ADB
adb connect localhost:5555# 安装 Magisk
adb install Magisk.apk
5.2 方案 B:构建含 Magisk 的镜像(更稳定)
创建 Magisk 集成脚本:
#!/bin/bash
# ~/redroid-build/integrate-magisk.shset -eMAGISK_VERSION="27.0"
MAGISK_APK="Magisk-v${MAGISK_VERSION}.apk"
WORKDIR=$(mktemp -d)echo "[*] 下载 Magisk..."
wget -q "https://github.com/topjohnwu/Magisk/releases/download/v${MAGISK_VERSION}/${MAGISK_APK}" \
-O "${WORKDIR}/${MAGISK_APK}"echo "[*] 解压 Magisk..."
cd "${WORKDIR}"
unzip -q "${MAGISK_APK}" -d magisk_extractedecho "[*] 准备 Magisk 文件..."
mkdir -p magisk_overlay/system/app/Magisk
cp "${MAGISK_APK}" magisk_overlay/system/app/Magisk/Magisk.apk# 提取 native 库
mkdir -p magisk_overlay/system/lib64
unzip -q "${MAGISK_APK}" 'lib/x86_64/*' -d tmp_libs 2>/dev/null || \
unzip -q "${MAGISK_APK}" 'lib/x86/*' -d tmp_libs 2>/dev/nullecho "[*] Magisk 文件准备完成: ${WORKDIR}/magisk_overlay/"
echo "[*] 将此目录挂载到 redroid 容器中"
5.3 使用 Magisk Delta 或 KernelSU on Docker
对于 redroid,更实用的方式是使用修改后的 init 流程:
# Dockerfile.magisk
FROM redroid-with-ndk:12.0.0# 复制 Magisk 二进制文件到系统分区
COPY magisk_files/magiskinit /system/bin/magiskinit
COPY magisk_files/magisk64 /system/bin/magisk64
COPY magisk_files/magisk32 /system/bin/magisk32
COPY magisk_files/busybox /system/bin/busybox_magiskRUN chmod 755 /system/bin/magiskinit \
/system/bin/magisk64 \
/system/bin/magisk32 \
/system/bin/busybox_magisk# Magisk 的 init overlay
COPY magisk_overlay/ /system/
5.4 更实际的做法:直接在运行中的容器里 Patch
# 1. 启动 redroid 容器
docker run -d --name redroid \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
redroid-with-ndk:12.0.0 \
androidboot.redroid_gpu_mode=guest \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.native.bridge=libndk_translation.so \
ro.debuggable=1 \
ro.secure=0 \
ro.adb.secure=0# 2. 等待启动完成
sleep 30# 3. 连接 ADB
adb connect localhost:5555# 4. 安装 Magisk Manager
adb install Magisk-v27.0.apk# 5. 进入容器 Shell 执行 Root 操作
docker exec -it redroid sh# 在容器内:
# Magisk 通常需要 patch boot.img,但 redroid 没有传统 boot 分区
# 需要使用 "Direct Install (Recommended)" 方式
# 或者使用以下脚本模拟
5.5 使用 redroid-magisk 项目(最推荐)
# 这是专门为 redroid 适配 Magisk 的项目
git clone https://github.com/nicknisi/redroid-magisk.git
# 或搜索类似的适配项目:
# https://github.com/nicknisi/redroid-magisk
# https://github.com/nicknisi/redroidcd redroid-magisk# 按项目说明构建
docker build -t redroid-magisk:12.0.0 .
第六部分:LSPosed 安装
6.1 前提条件
- ✅ Magisk 已正常运行
- ✅ Zygisk 已在 Magisk 设置中启用
6.2 安装步骤
# 1. 下载 LSPosed (Zygisk 版本)
wget https://github.com/LSPosed/LSPosed/releases/download/v1.9.2/LSPosed-v1.9.2-7024-zygisk-release.zip \
-O LSPosed.zip# 2. 推送到设备
adb connect localhost:5555
adb push LSPosed.zip /sdcard/# 3. 通过 Magisk Manager 安装模块
# - 打开 Magisk App
# - 底部导航 → 模块
# - 从存储安装 → 选择 LSPosed.zip
# - 安装完成后重启# 4. 重启容器
docker restart redroid
# 等待约30秒# 5. 验证
adb connect localhost:5555
adb shell
# 在 shell 中检查 LSPosed 是否运行
ls /data/adb/modules/zygisk_lsposed/
6.3 LSPosed Manager
# LSPosed Manager 安装后会自动创建通知快捷方式
# 也可以通过以下命令手动启动
adb shell am start -n \
org.lsposed.manager/.ui.activity.MainActivity# 或者安装独立的 LSPosed Manager APK
# (从 LSPosed releases 下载 manager.apk)
adb install LSPosed-manager.apk
第七部分:远程显示 & 交互
7.1 scrcpy(推荐)
# Windows 上安装 scrcpy
# 下载: https://github.com/Genymobile/scrcpy/releases
# 或通过 winget:
winget install Genymobile.scrcpy# 连接并显示
adb connect localhost:5555
scrcpy -s localhost:5555
7.2 redroid 自带 VNC
# 启动时添加 VNC 端口映射
docker run -d --name redroid \
--privileged \
-v ~/redroid-data:/data \
-p 5555:5555 \
-p 5900:5900 \
redroid-with-ndk:12.0.0 \
androidboot.redroid_gpu_mode=guest \
# ... 其他参数
7.3 Web 浏览器访问(ws-scrcpy)
# 部署 ws-scrcpy 实现浏览器访问
docker run -d --name ws-scrcpy \
-p 8000:8000 \
--link redroid:redroid \
nicknisi/ws-scrcpy:latest# 浏览器访问: http://localhost:8000
第八部分:完整的 Docker Compose 配置
# ~/redroid-project/docker-compose.yml
version: "3.8"services:
redroid:
image: redroid-custom:12.0.0 # 你构建的包含ARM翻译+Magisk的镜像
container_name: redroid
privileged: true
ports:
- "5555:5555" # ADB
- "5900:5900" # VNC (可选)
volumes:
- redroid-data:/data
command:
- androidboot.redroid_gpu_mode=guest
- androidboot.redroid_fps=60
- androidboot.redroid_width=1080
- androidboot.redroid_height=1920
- androidboot.redroid_dpi=480
- ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi
- ro.product.cpu.abilist64=x86_64,arm64-v8a
- ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi
- ro.dalvik.vm.native.bridge=libndk_translation.so
- ro.debuggable=1
- ro.secure=0
- ro.adb.secure=0
deploy:
resources:
limits:
memory: 4G
cpus: "4"
restart: unless-stoppedvolumes:
redroid-data:
driver: local
docker compose up -d
第九部分:一键自动化脚本
#!/bin/bash
# ~/redroid-project/setup-all.sh
# 一键部署 redroid + ARM翻译 + Magisk + LSPosedset -eRED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m'WORKDIR=~/redroid-project
ANDROID_VERSION="12.0.0"
MAGISK_VERSION="27.0"
LSPOSED_VERSION="1.9.2"
ADB_PORT=5555log() { echo -e "${GREEN}[✓]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; }
err() { echo -e "${RED}[✗]${NC} $1"; exit 1; }# ============ 环境检查 ============
check_env() {
log "检查环境..." # 检查 binder 支持
if ! grep -q binder /proc/filesystems 2>/dev/null; then
err "内核不支持 binder!请先编译自定义 WSL2 内核(参见第一部分)"
fi # 检查 Docker
if ! command -v docker &>/dev/null; then
err "Docker 未安装!"
fi # 检查 ADB
if ! command -v adb &>/dev/null; then
warn "ADB 未安装,正在安装..."
sudo apt install -y android-tools-adb
fi # 挂载 binderfs
if ! mountpoint -q /dev/binderfs 2>/dev/null; then
sudo mkdir -p /dev/binderfs
sudo mount -t binder binder /dev/binderfs
log "已挂载 binderfs"
fi log "环境检查通过 ✓"
}# ============ 构建镜像 ============
build_image() {
log "构建 redroid 镜像(含 ARM 翻译)..." mkdir -p ${WORKDIR}/build && cd ${WORKDIR}/build # 创建 Dockerfile
cat > Dockerfile << 'DOCKERFILE'
FROM redroid/redroid:12.0.0-latest# 注意:实际使用时需要将 ARM 翻译文件放入 ndk_translation 目录
# COPY ndk_translation/ /system/# 设置属性
RUN echo "persist.sys.nativebridge=1" >> /system/build.prop && \
echo "ro.enable.native.bridge.exec=1" >> /system/build.prop && \
echo "ro.dalvik.vm.native.bridge=libndk_translation.so" >> /system/build.prop
DOCKERFILE # 如果有 ARM 翻译文件则构建自定义镜像
if [ -d "ndk_translation" ]; then
docker build -t redroid-custom:${ANDROID_VERSION} .
log "自定义镜像构建完成"
else
warn "未找到 ARM 翻译文件,使用基础镜像"
docker tag redroid/redroid:${ANDROID_VERSION}-latest redroid-custom:${ANDROID_VERSION}
fi
}# ============ 启动容器 ============
start_redroid() {
log "启动 redroid 容器..." # 停止旧容器
docker rm -f redroid 2>/dev/null || true docker run -d --name redroid \
--privileged \
-v ${WORKDIR}/data:/data \
-p ${ADB_PORT}:5555 \
redroid-custom:${ANDROID_VERSION} \
androidboot.redroid_gpu_mode=guest \
androidboot.redroid_fps=60 \
androidboot.redroid_width=1080 \
androidboot.redroid_height=1920 \
ro.product.cpu.abilist=x86_64,arm64-v8a,x86,armeabi-v7a,armeabi \
ro.product.cpu.abilist64=x86_64,arm64-v8a \
ro.product.cpu.abilist32=x86,armeabi-v7a,armeabi \
ro.dalvik.vm.native.bridge=libndk_translation.so \
ro.debuggable=1 \
ro.secure=0 \
ro.adb.secure=0 log "等待 Android 启动..."
sleep 45 # 连接 ADB
adb disconnect localhost:${ADB_PORT} 2>/dev/null || true
adb connect localhost:${ADB_PORT} # 等待设备就绪
adb -s localhost:${ADB_PORT} wait-for-device
log "Android 已启动 ✓"
}# ============ 安装 Magisk ============
install_magisk() {
log "安装 Magisk v${MAGISK_VERSION}..." cd ${WORKDIR} # 下载 Magisk
if [ ! -f "Magisk-v${MAGISK_VERSION}.apk" ]; then
wget -q "https://github.com/topjohnwu/Magisk/releases/download/v${MAGISK_VERSION}/Magisk-v${MAGISK_VERSION}.apk"
fi # 安装
adb -s localhost:${ADB_PORT} install -r "Magisk-v${MAGISK_VERSION}.apk" log "Magisk 已安装 ✓"
warn "请手动打开 Magisk App 完成初始化设置,然后启用 Zygisk"
}# ============ 安装 LSPosed ============
install_lsposed() {
log "安装 LSPosed v${LSPOSED_VERSION}..." cd ${WORKDIR} # 下载 LSPosed
if [ ! -f "LSPosed-v${LSPOSED_VERSION}.zip" ]; then
wget -q "https://github.com/LSPosed/LSPosed/releases/download/v${LSPOSED_VERSION}/LSPosed-v${LSPOSED_VERSION}-7024-zygisk-release.zip" \
-O "LSPosed-v${LSPOSED_VERSION}.zip"
fi # 推送到设备
adb -s localhost:${ADB_PORT} push "LSPosed-v${LSPOSED_VERSION}.zip" /sdcard/ log "LSPosed 模块已推送到 /sdcard/"
warn "请在 Magisk App 中: 模块 → 从本地安装 → 选择 LSPosed zip → 重启"
}# ============ 主流程 ============
main() {
echo "================================================"
echo " redroid 全功能部署脚本"
echo " Android ${ANDROID_VERSION} + ARM翻译 + Magisk + LSPosed"
echo "================================================"
echo "" check_env
build_image
start_redroid
install_magisk echo ""
warn "=== 手动步骤 ==="
echo "1. 使用 scrcpy 连接: scrcpy -s localhost:${ADB_PORT}"
echo "2. 打开 Magisk App → 设置 → 启用 Zygisk → 重启"
echo "3. 重启后运行: $0 --lsposed 安装 LSPosed"
echo "4. 在 Magisk 中安装 LSPosed 模块 → 重启"
echo ""
log "部署完成!🎉"
}# 参数处理
case "${1}" in
--lsposed)
install_lsposed
;;
--restart)
docker restart redroid
sleep 30
adb connect localhost:${ADB_PORT}
;;
*)
main
;;
esac
chmod +x setup-all.sh
./setup-all.sh
常见问题排查
Q1: 容器启动失败 — binder: Failed to open
# 确认 binder 模块加载
grep binder /proc/filesystems
# 如果没有输出,说明内核不支持# 解决: 重新编译内核(第一部分)
# 或加载模块
sudo modprobe binder_linux
sudo modprobe ashmem_linux
Q2: ARM 应用闪退
# 检查 native bridge 是否生效
adb shell getprop ro.dalvik.vm.native.bridge
# 应返回 libndk_translation.so 或 libhoudini.so# 检查支持的 ABI
adb shell getprop ro.product.cpu.abilist
# 应包含 arm64-v8a, armeabi-v7a# 查看 crash log
adb logcat | grep -E "(FATAL|crash|native.bridge)"
Q3: Magisk 无法获取 Root
# redroid 默认以 root 运行,但 Magisk 需要额外设置
# 在容器内检查
adb shell id
# uid=0(root) 表示已有 root# 如果 Magisk 不识别,尝试:
adb shell setprop ro.debuggable 1
adb shell setprop ro.secure 0
Q4: 性能优化
# 1. 分配更多资源
docker update --memory=8g --cpus=6 redroid# 2. 使用 virtio-gpu (如果宿主支持)
# 替换 androidboot.redroid_gpu_mode=guest 为:
# androidboot.redroid_gpu_mode=host# 3. 使用 tmpfs 加速 /data
docker run ... --tmpfs /cache:rw,size=512m ...
备选方案对比
| 方案 | ARM 翻译 | Magisk | LSPosed | 难度 | Docker |
|---|---|---|---|---|---|
| redroid (本文) | ✅ | ✅ | ✅ | ⭐⭐⭐⭐⭐ | ✅ |
| Genymotion | ✅ | ✅ | ✅ | ⭐⭐ | ❌ |
| Android Studio AVD | ✅ | ⚠️ | ⚠️ | ⭐⭐⭐ | ❌ |
| WSA (已停止) | ✅ | ✅ | ✅ | ⭐⭐ | ❌ |
| Waydroid (Linux) | ✅ | ✅ | ✅ | ⭐⭐⭐ | ❌ |
如果不强制要求 Docker,Genymotion 或带 Magisk 补丁的 Android Studio Emulator 是更简单的选择。redroid 的优势在于可以批量部署、CI/CD 集成和云原生场景。
