当前位置: 首页 > news >正文

树莓派 (ARM) 运行 redroid Android Docker

树莓派 (ARM) 运行 redroid Android Docker

 

直接回答:可以,而且是最佳方案之一

text
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 都能运行。


完整部署指南

第一步:准备树莓派

Bash
# 推荐配置
# - 树莓派 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 — 编译内核模块

Bash
# 安装依赖
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 模块(更简单)

Bash
# 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

Bash
# 必须看到 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

Bash
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
newgrp docker

# 验证
docker run --rm hello-world

第四步:运行 redroid (ARM 版)

Bash
# 关键:使用 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

Bash
# 等待启动(首次较慢,约1-2分钟)
docker logs -f redroid

# 看到类似 "Boot completed" 后连接
adb connect localhost:5555
adb devices

第五步:验证 ARM 原生支持

Bash
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

Bash
# 下载 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

Bash
# 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

性能优化(树莓派专用)

Bash
# /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
Bash
# 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

存储优化

Bash
# 强烈建议使用 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 方案对比

text
┌─────────────────┬──────────────────────┬──────────────────────┐
│                 │   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) 完整指南

整体架构

text
┌──────────────────────────────────────────────────┐
│              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 安装编译依赖

Bash
# 在 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 内核源码

Bash
# 查看当前内核版本
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 修改内核配置

Bash
# 以默认 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 编译内核

Bash
# -j$(nproc) 使用所有CPU核心编译
make -j$(nproc)# 编译完成后,内核文件在:
ls -la arch/x86/boot/bzImage

1.5 安装自定义内核

Bash
# 复制到 Windows 用户目录
cp arch/x86/boot/bzImage /mnt/c/Users/<你的用户>/wsl2-kernel

在 Windows 中创建/编辑 C:\Users\<你的用户名>\.wslconfig

ini
[wsl2]
kernel=C:\\Users\\<你的用户名>\\wsl2-kernel
memory=8GB
processors=4
PowerShell
# 在 PowerShell 中重启 WSL2
wsl --shutdown
wsl

1.6 验证内核模块

Bash
# 重新进入 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(推荐)

Bash
# 安装 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 基础运行测试

Bash
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
Bash
# 验证容器是否正常运行
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 翻译的镜像

创建工作目录:

Bash
mkdir -p ~/redroid-build && cd ~/redroid-build

4.2.1 获取 libndk_translation

Bash
# 从 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

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 更简便的方式 — 使用社区预构建脚本

Bash
# 克隆社区维护的 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 的社区镜像

Bash
# 一些社区维护的预构建镜像(需要自行验证可用性)
# 格式: docker pull <image># 搜索 Docker Hub 上的 redroid 镜像
docker search redroid

4.3 运行带 ARM 翻译的容器

Bash
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 翻译

Bash
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:运行时安装(推荐)

Bash
# 下载 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 集成脚本:

Bash
#!/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
# 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

Bash
# 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 项目(最推荐)

Bash
# 这是专门为 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 安装步骤

Bash
# 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

Bash
# 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(推荐)

Bash
# 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

Bash
# 启动时添加 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)

Bash
# 部署 ws-scrcpy 实现浏览器访问
docker run -d --name ws-scrcpy \
  -p 8000:8000 \
  --link redroid:redroid \
  nicknisi/ws-scrcpy:latest# 浏览器访问: http://localhost:8000

第八部分:完整的 Docker Compose 配置

YAML
# ~/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
Bash
docker compose up -d

第九部分:一键自动化脚本

Bash
#!/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
Bash
chmod +x setup-all.sh
./setup-all.sh

常见问题排查

Q1: 容器启动失败 — binder: Failed to open

Bash
# 确认 binder 模块加载
grep binder /proc/filesystems
# 如果没有输出,说明内核不支持# 解决: 重新编译内核(第一部分)
# 或加载模块
sudo modprobe binder_linux
sudo modprobe ashmem_linux

Q2: ARM 应用闪退

Bash
# 检查 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

Bash
# redroid 默认以 root 运行,但 Magisk 需要额外设置
# 在容器内检查
adb shell id
# uid=0(root) 表示已有 root# 如果 Magisk 不识别,尝试:
adb shell setprop ro.debuggable 1
adb shell setprop ro.secure 0

Q4: 性能优化

Bash
# 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 翻译MagiskLSPosed难度Docker
redroid (本文) ⭐⭐⭐⭐⭐
Genymotion ⭐⭐
Android Studio AVD ⚠️ ⚠️ ⭐⭐⭐
WSA (已停止) ⭐⭐
Waydroid (Linux) ⭐⭐⭐

如果不强制要求 Docker,Genymotion 或带 Magisk 补丁的 Android Studio Emulator 是更简单的选择。redroid 的优势在于可以批量部署、CI/CD 集成和云原生场景。

 

在 x86 Windows 上运行 Android Docker (redroid) 完整指南

整体架构

text
┌──────────────────────────────────────────────────┐
│              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 安装编译依赖

Bash
# 在 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 内核源码

Bash
# 查看当前内核版本
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 修改内核配置

Bash
# 以默认 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 编译内核

Bash
# -j$(nproc) 使用所有CPU核心编译
make -j$(nproc)# 编译完成后,内核文件在:
ls -la arch/x86/boot/bzImage

1.5 安装自定义内核

Bash
# 复制到 Windows 用户目录
cp arch/x86/boot/bzImage /mnt/c/Users/<你的用户>/wsl2-kernel

在 Windows 中创建/编辑 C:\Users\<你的用户名>\.wslconfig

ini
[wsl2]
kernel=C:\\Users\\<你的用户名>\\wsl2-kernel
memory=8GB
processors=4
PowerShell
# 在 PowerShell 中重启 WSL2
wsl --shutdown
wsl

1.6 验证内核模块

Bash
# 重新进入 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(推荐)

Bash
# 安装 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 基础运行测试

Bash
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
Bash
# 验证容器是否正常运行
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 翻译的镜像

创建工作目录:

Bash
mkdir -p ~/redroid-build && cd ~/redroid-build

4.2.1 获取 libndk_translation

Bash
# 从 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

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 更简便的方式 — 使用社区预构建脚本

Bash
# 克隆社区维护的 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 的社区镜像

Bash
# 一些社区维护的预构建镜像(需要自行验证可用性)
# 格式: docker pull <image># 搜索 Docker Hub 上的 redroid 镜像
docker search redroid

4.3 运行带 ARM 翻译的容器

Bash
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 翻译

Bash
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:运行时安装(推荐)

Bash
# 下载 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 集成脚本:

Bash
#!/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
# 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

Bash
# 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 项目(最推荐)

Bash
# 这是专门为 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 安装步骤

Bash
# 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

Bash
# 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(推荐)

Bash
# 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

Bash
# 启动时添加 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)

Bash
# 部署 ws-scrcpy 实现浏览器访问
docker run -d --name ws-scrcpy \
  -p 8000:8000 \
  --link redroid:redroid \
  nicknisi/ws-scrcpy:latest# 浏览器访问: http://localhost:8000

第八部分:完整的 Docker Compose 配置

YAML
# ~/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
Bash
docker compose up -d

第九部分:一键自动化脚本

Bash
#!/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
Bash
chmod +x setup-all.sh
./setup-all.sh

常见问题排查

Q1: 容器启动失败 — binder: Failed to open

Bash
# 确认 binder 模块加载
grep binder /proc/filesystems
# 如果没有输出,说明内核不支持# 解决: 重新编译内核(第一部分)
# 或加载模块
sudo modprobe binder_linux
sudo modprobe ashmem_linux

Q2: ARM 应用闪退

Bash
# 检查 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

Bash
# redroid 默认以 root 运行,但 Magisk 需要额外设置
# 在容器内检查
adb shell id
# uid=0(root) 表示已有 root# 如果 Magisk 不识别,尝试:
adb shell setprop ro.debuggable 1
adb shell setprop ro.secure 0

Q4: 性能优化

Bash
# 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 翻译MagiskLSPosed难度Docker
redroid (本文) ⭐⭐⭐⭐⭐
Genymotion ⭐⭐
Android Studio AVD ⚠️ ⚠️ ⭐⭐⭐
WSA (已停止) ⭐⭐
Waydroid (Linux) ⭐⭐⭐

如果不强制要求 Docker,Genymotion 或带 Magisk 补丁的 Android Studio Emulator 是更简单的选择。redroid 的优势在于可以批量部署、CI/CD 集成和云原生场景。