# redroid-multi
**Repository Path**: cyberant/redroid-multi
## Basic Information
- **Project Name**: redroid-multi
- **Description**: linux-redroid
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-03-18
- **Last Updated**: 2026-03-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Redroid 安卓多开管理系统



**基于 Docker + Redroid 的 Android 云手机/模拟器多开解决方案**
支持多实例管理、Web 投屏、VNC 远程桌面、ADB 调试等功能
---
## 📑 目录
- [项目简介](#-项目简介)
- [系统架构](#-系统架构)
- [环境要求](#-环境要求)
- [快速开始](#-快速开始)
- [配置详解](#-配置详解)
- [使用指南](#-使用指南)
- [故障排除](#-故障排除)
- [项目结构](#-项目结构)
- [API 参考](#-api-参考)
- [更新日志](#-更新日志)
---
## 📱 项目简介
本项目提供一套完整的 **Android 容器化多开方案**,基于 [Redroid](https://github.com/remote-android/redroid-doc)(Remote Android)技术,允许在 Linux 服务器上运行多个独立的 Android 实例。
### 核心特性
| 特性 | 说明 |
|------|------|
| 🚀 **多实例支持** | 同时运行 2 个及以上独立 Android 系统 |
| 🔧 **版本灵活** | 支持 Android 11、13 等多个版本 |
| 🌐 **多种连接** | ADB、VNC、Web 投屏、scrcpy 多种方式 |
| 📦 **应用管理** | APK 安装、设备信息修改、自动化脚本 |
| 🛡️ **数据持久化** | 容器数据挂载到宿主机,重启不丢失 |
| 🔒 **安全隔离** | 每个实例独立运行,互不干扰 |
| ⚡ **资源优化** | 内存/CPU 可配置,适配不同硬件 |
### 应用场景
- **移动应用测试** - 自动化测试、兼容性验证
- **云手机服务** - 远程 Android 桌面、游戏挂机
- **开发调试** - ADB 远程调试、日志分析
- **应用多开** - 社交应用多账号、游戏多角色
- **爬虫采集** - 移动端数据采集、自动化操作
---
## 🏗️ 系统架构
### 架构图
```
┌─────────────────────────────────────────────────────────────────┐
│ 宿主机 (Linux) │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Docker 引擎 │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │ │
│ │ │ Android 1 │ │ Android 2 │ │ ADB Server │ │ │
│ │ │ (Redroid) │ │ (Redroid) │ │ (devicefarmer) │ │ │
│ │ │ ┌───────┐ │ │ ┌───────┐ │ │ │ │ │
│ │ │ │ adbd │ │ │ │ adbd │ │ │ │ │ │
│ │ │ └───┬───┘ │ │ └───┬───┘ │ │ │ │ │
│ │ │ :5555 │ │ :5556 │ │ :5037 │ │ │
│ │ └─────┬───────┘ └─────┬───────┘ └────────┬────────┘ │ │
│ │ │ │ │ │ │
│ │ └────────────────┴───────────────────┘ │ │
│ │ │ │ │
│ │ ┌──────────────────────┼──────────────────────┐ │ │
│ │ │ Redroid 网络 │ (bridge) │ │ │
│ │ └──────────────────────┼──────────────────────┘ │ │
│ │ │ │ │
│ │ ┌──────────────────────┼──────────────────────┐ │ │
│ │ │ scrcpy-web │ noVNC/VNC │ │ │
│ │ │ (Web 投屏) │ (远程桌面) │ │ │
│ │ │ :6080/:6081 │ :5901/:5902 │ │ │
│ │ └──────────────────────┴──────────────────────┘ │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────┼───────────────────────────┐ │
│ │ 数据卷挂载 │ (持久化存储) │ │
│ │ ./data/redroid1/ │ ./data/redroid2/ │ │
│ │ (Android 1 数据) │ (Android 2 数据) │ │
│ └───────────────────────────┴───────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ ADB │ │ Web 浏览器│ │ VNC 客户端│
│ 客户端 │ │ (投屏/控制)│ │ (远程桌面)│
└─────────┘ └─────────┘ └─────────┘
```
### 组件说明
| 组件 | 镜像 | 功能描述 |
|------|------|----------|
| `redroid1/redroid2` | `redroid/redroid:11.0.0-latest` | Android 容器实例 |
| `adb-server` | `devicefarmer/adb:latest` | ADB 服务,统一管理设备连接 |
| `scrcpy-web` | `devicefarmer/scrcpy-web:latest` | Web 端屏幕投射和控制 |
| `novnc1/novnc2` | `theasp/novnc:latest` | 基于 Web 的 VNC 客户端 |
| `socks5-proxy` | `serjs/go-socks5-proxy:latest` | SOCKS5 代理服务 |
---
## 💻 环境要求
### 硬件要求
| 配置 | 最小要求 | 推荐配置 | 极限配置 |
|------|----------|----------|----------|
| CPU | 4 核 | 8 核 | 16 核+ |
| 内存 | 8 GB | 16 GB | 32 GB+ |
| 存储 | 20 GB SSD | 50 GB SSD | 100 GB+ SSD |
| 网络 | 10 Mbps | 100 Mbps | 1 Gbps |
**实例容量参考**(每个 Android 实例):
- 保守模式:2 核 CPU + 3 GB 内存 → 8核16G 可开 2 个
- 标准模式:2 核 CPU + 3 GB 内存 → 8核16G 可开 3 个
- 极限模式:1.5 核 CPU + 2 GB 内存 → 8核16G 可开 4 个
### 系统要求
- **操作系统**: Linux (Ubuntu 20.04+ / Debian 11+ / CentOS 8+ 推荐)
- **内核版本**: 5.4+(需支持 binder 和 ashmem 模块)
- **Docker**: 20.10+
- **docker-compose**: 1.29+ 或 2.0+
### 内核模块要求
Redroid 依赖以下 Linux 内核模块:
```bash
# 必需模块
binder_linux # Android IPC 机制
ashmem_linux # Android 共享内存
# 验证模块加载
lsmod | grep -E "binder|ashmem"
```
---
## 🚀 快速开始
### 1. 安装 Docker
```bash
# 安装 Docker
curl -fsSL https://get.docker.com | sh
# 添加用户到 docker 组
sudo usermod -aG docker $USER
# 重新登录或使用以下命令使权限生效
newgrp docker
# 安装 docker-compose
sudo apt update && sudo apt install docker-compose -y
```
### 2. 加载内核模块
```bash
# 安装额外内核模块
sudo apt install linux-modules-extra-$(uname -r) -y
# 加载所需模块
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux
# 验证模块加载
lsmod | grep binder
lsmod | grep ashmem
```
### 3. 克隆项目
```bash
git clone
cd redroid-multi
```
### 4. 环境初始化
```bash
# 检查环境、加载模块、拉取镜像
npm run create
```
### 5. 启动 Android 实例
```bash
# 启动两个 Android 容器
npm run start
```
首次启动需要 **1-2 分钟** 完成系统初始化。
### 6. 连接 ADB
```bash
# 安装 ADB 工具
sudo apt install adb -y
# 连接两个 Android 实例
adb connect localhost:5555
adb connect localhost:5556
# 查看设备列表
adb devices
```
预期输出:
```
List of devices attached
localhost:5555 device
localhost:5556 device
```
### 7. 屏幕查看
**方式一:scrcpy(推荐,需图形界面)**
```bash
# 连接安卓1
scrcpy --serial localhost:5555
# 连接安卓2(新开终端)
scrcpy --serial localhost:5556
```
**方式二:ffplay(无需 ADB,服务端直接查看)**
```bash
# 查看安卓1
./scrcpy-ff.sh 1
# 查看安卓2
./scrcpy-ff.sh 2
```
**方式三:Web 投屏**
```bash
# 使用 docker-compose-web.yml 启动 Web 服务
docker-compose -f docker-compose-web.yml up -d
# 访问 http://localhost:6080
```
---
## ⚙️ 配置详解
### Docker Compose 配置文件
项目提供多个 Docker Compose 配置,适应不同场景:
#### 1. `docker-compose.yml` - 标准模式(VPN + 代理支持)
```yaml
version: '3.8'
services:
redroid1:
image: redroid/redroid:11.0.0-latest # Android 11
container_name: redroid1
privileged: true # 必需:特权模式
cap_add: # 添加能力
- NET_ADMIN # 网络管理
- NET_RAW
- SYS_ADMIN
devices: # 设备映射
- /dev/net/tun:/dev/net/tun # TUN 设备(VPN)
- /dev/tun:/dev/tun
ports:
- "5555:5555" # ADB 端口
- "5901:5900" # VNC 端口
volumes:
- ./data/redroid1:/data # 数据持久化
environment: # Android 属性
- ANDROID_EMULATOR_MAKE_FAKE_DEVICES=yes
- RO_HARDWARE=redroid
- RO_PRODUCT_CPU_ABI=x86_64
- ro.debuggable=1 # 可调试
- ro.secure=0 # 关闭安全限制
restart: unless-stopped
networks:
- redroid-net
sysctls: # 内核参数
- net.ipv4.ip_forward=1
- net.ipv6.conf.all.forwarding=1
```
#### 2. `docker-compose-web.yml` - Web 投屏模式
包含 `scrcpy-web` 服务,提供浏览器访问的屏幕投射:
```yaml
scrcpy-web:
image: devicefarmer/scrcpy-web:latest
ports:
- "6080:8080" # Web 访问端口
environment:
- ADB_SERVER_SOCKET=tcp:adb-server:5037
```
#### 3. `docker-compose-vnc.yml` - VNC 远程桌面
包含 `noVNC` 服务,提供基于 Web 的 VNC 客户端:
```yaml
novnc1:
image: theasp/novnc:latest
ports:
- "6080:8080"
environment:
- VNC_HOST=host.docker.internal
- VNC_PORT=5901 # 对应 redroid1 的 VNC
```
#### 4. `docker-compose-gui.yml` - GUI 模式(双 Web 投屏)
每个 Android 实例配备独立的 scrcpy-web 服务:
| 服务 | 端口 | 说明 |
|------|------|------|
| web1 | 6080 | Android 1 的 Web 投屏 |
| web2 | 6081 | Android 2 的 Web 投屏 |
#### 5. `docker-compose-bliss.yml` - Bliss OS 模式
使用 `sickcodes/dock-droid` 镜像,带完整图形界面:
```yaml
bliss1:
image: sickcodes/dock-droid:latest
environment:
- RAM=2048 # 分配内存
- CORES=2 # 分配 CPU 核心
```
### 端口规划
| 实例 | ADB 端口 | VNC 端口 | Web 投屏 | 用途 |
|------|----------|----------|----------|------|
| Android 1 | 5555 | 5901 | 6080 | 主实例,完整功能 |
| Android 2 | 5556 | 5902 | 6081 | 次实例 |
| ADB Server | - | - | 5037 | ADB 服务端口 |
| SOCKS5 代理 | - | - | 1080 | 代理服务 |
### 环境变量配置
#### Redroid 环境变量
| 变量名 | 默认值 | 说明 |
|--------|--------|------|
| `ANDROID_EMULATOR_MAKE_FAKE_DEVICES` | `yes` | 创建虚拟设备节点 |
| `RO_HARDWARE` | `redroid` | 硬件标识 |
| `RO_PRODUCT_CPU_ABI` | `x86_64` | CPU 架构 |
| `ro.debuggable` | `1` | 允许调试 |
| `ro.secure` | `0` | 关闭安全模式(root) |
| `RO_PRODUCT_MANUFACTURER` | - | 设备厂商 |
| `RO_PRODUCT_MODEL` | - | 设备型号 |
#### 伪装设备信息示例
```yaml
environment:
- RO_PRODUCT_MANUFACTURER=Samsung
- RO_PRODUCT_MODEL=SM-G991B
- RO_PRODUCT_BRAND=samsung
- RO_BUILD_ID=RP1A.200720.012
```
---
## 📖 使用指南
### NPM 命令速查
```bash
# 环境管理
npm run create # 检查环境、拉取镜像
npm run start # 启动 Android 容器
npm run stop # 停止容器
npm run rm # 删除容器和数据(危险!)
npm run status # 查看容器状态
# 日志查看
npm run logs:1 # 查看 Android 1 日志
npm run logs:2 # 查看 Android 2 日志
# 交互操作
npm run shell # 进入 Android Shell
npm run screenshot # 截图并导出
npm run install # 安装 APK(交互式)
npm run install:node # 使用 Node.js 安装 APK
npm run scrcpy # 启动 scrcpy 连接
npm run cmd # 在 Android 执行命令
```
### ADB 操作指南
#### 设备连接
```bash
# 连接设备
adb connect localhost:5555
adb connect localhost:5556
# 断开设备
adb disconnect localhost:5555
# 查看设备
adb devices -l
```
#### 应用管理
```bash
# 安装 APK(指定设备)
adb -s localhost:5555 install app.apk
# 卸载应用
adb -s localhost:5555 uninstall com.example.app
# 列出已安装应用
adb -s localhost:5555 shell pm list packages
# 清除应用数据
adb -s localhost:5555 shell pm clear com.example.app
```
#### 文件传输
```bash
# 推送到设备
adb -s localhost:5555 push local.txt /sdcard/
# 从设备拉取
adb -s localhost:5555 pull /sdcard/remote.txt ./
```
#### 屏幕操作
```bash
# 截图
adb -s localhost:5555 shell screencap /sdcard/screen.png
adb -s localhost:5555 pull /sdcard/screen.png
# 录屏
adb -s localhost:5555 shell screenrecord /sdcard/video.mp4
# 点击屏幕
adb -s localhost:5555 shell input tap 500 500
# 输入文字
adb -s localhost:5555 shell input text "Hello World"
# 滑动
adb -s localhost:5555 shell input swipe 300 1000 300 500
# 按键
adb -s localhost:5555 shell input keyevent 26 # 电源键
adb -s localhost:5555 shell input keyevent 3 # Home 键
adb -s localhost:5555 shell input keyevent 4 # 返回键
```
#### Shell 访问
```bash
# 进入 Android Shell
adb -s localhost:5555 shell
# 执行单条命令
adb -s localhost:5555 shell "ls -la /sdcard"
adb -s localhost:5555 shell "ps -A | grep com.android"
```
### APK 安装
#### 方式一:使用脚本
```bash
# 安装到 Android 1
npm run install:node -- /path/to/app.apk 1
# 安装到 Android 2
npm run install:node -- /path/to/app.apk 2
```
#### 方式二:直接 ADB
```bash
adb -s localhost:5555 install -r app.apk
```
#### 方式三:批量安装
```bash
for apk in *.apk; do
adb -s localhost:5555 install "$apk"
done
```
### 屏幕查看方式对比
| 方式 | 延迟 | 交互 | 依赖 | 适用场景 |
|------|------|------|------|----------|
| scrcpy | 低 (~50ms) | ✅ | 需要 ADB + 图形界面 | 本地操作 |
| ffplay | 中 (~500ms) | ❌ | 仅需 Docker | 服务端查看 |
| Web 投屏 | 中 (~200ms) | ✅ | 浏览器 | 远程访问 |
| VNC | 高 (~1s) | ✅ | VNC 客户端 | 远程桌面 |
| 截图 | 高 (~5s) | ❌ | 仅需 Docker | 简单查看 |
### 设备信息修改(防风控)
```bash
# 修改设备信息
node change-device.js
```
该脚本会随机修改以下信息:
- Android ID
- 设备型号 (ro.product.model)
- 厂商信息 (ro.product.manufacturer)
- 序列号 (ro.serialno)
- 构建 ID (ro.build.id)
**注意**:修改后需要重启容器生效:
```bash
npm run stop && npm run start
```
---
## 🔧 故障排除
### 1. 容器启动失败
**症状**:`docker ps` 看不到 redroid 容器
**排查步骤**:
```bash
# 查看容器日志
docker logs redroid1
# 检查内核模块
lsmod | grep binder
lsmod | grep ashmem
# 重新加载模块
sudo modprobe binder_linux devices="binder,hwbinder,vndbinder"
sudo modprobe ashmem_linux
```
**解决方案**:
```bash
# 安装内核模块
sudo apt install linux-modules-extra-$(uname -r) -y
```
### 2. ADB 连接失败
**症状**:`adb devices` 显示 `offline` 或空列表
**排查步骤**:
```bash
# 重启 ADB 服务
adb kill-server
adb start-server
# 重新连接
adb connect localhost:5555
# 检查容器端口
sudo docker exec redroid1 netstat -tlnp | grep 5555
```
**使用修复脚本**:
```bash
./fix-adb.sh
```
### 3. 系统卡顿或无响应
**解决方案**:
```bash
# 重启容器
npm run stop
npm run start
# 或者完全重建
npm run rm
npm run create
npm run start
```
### 4. scrcpy 连接问题
参考 `ADB_FIX.md` 文件,已知问题:
- Redroid adbd 只监听 IPv6
- 缺少 scrcpy-server 运行组件
**推荐替代方案**:
```bash
# 使用 ffplay 查看
./scrcpy-ff.sh 1
# 使用截图
npm run screenshot 1
```
### 5. 存储空间不足
```bash
# 清理 Docker 镜像
docker system prune -a
# 查看数据目录大小
du -sh data/
# 清理日志
docker logs --tail 100 redroid1 > /dev/null
```
### 6. 网络连接问题
```bash
# 检查容器网络
docker network ls
docker network inspect redroid-net
# 测试容器内网络
docker exec redroid1 ping -c 3 8.8.8.8
```
---
## 📁 项目结构
```
redroid-multi/
├── 📄 配置文件
│ ├── docker-compose.yml # 主配置(VPN + 代理支持)
│ ├── docker-compose-web.yml # Web 投屏配置
│ ├── docker-compose-vnc.yml # VNC 配置
│ ├── docker-compose-gui.yml # GUI 双 Web 投屏
│ ├── docker-compose-bliss.yml # Bliss OS 配置
│ └── package.json # npm 脚本定义
│
├── 📜 脚本工具
│ ├── install-apk.js # Node.js APK 安装器
│ ├── change-device.js # 设备信息修改工具
│ ├── scrcpy.sh # scrcpy 连接脚本
│ ├── scrcpy-ff.sh # ffplay 屏幕查看
│ ├── scrcpy-docker.sh # Docker scrcpy
│ ├── view.sh # 实时屏幕查看
│ ├── view1.sh / view2.sh # 快速查看脚本
│ ├── watch.sh # 连续截图查看
│ ├── fix-adb.sh # ADB 修复脚本
│ ├── emulator-setup.sh # 传统模拟器安装
│ └── scripts/ # npm 脚本目录
│ ├── create.sh # 环境初始化
│ ├── start.sh # 启动容器
│ ├── stop.sh # 停止容器
│ ├── rm.sh # 删除容器
│ ├── shell.sh # 进入 Shell
│ ├── screenshot.sh # 截图脚本
│ ├── install-apk.sh # APK 安装
│ └── cmd.sh # 命令执行
│
├── 🌐 Web 服务
│ ├── web-view/ # Web 查看器
│ │ └── server.py
│ ├── scrcpy-web/ # scrcpy Web 服务
│ │ └── Dockerfile
│ └── web-static/ # 静态资源
│
├── 📦 数据目录
│ └── data/ # 容器数据持久化
│ ├── redroid1/ # Android 1 数据
│ └── redroid2/ # Android 2 数据
│
└── 📚 文档
├── README.md # 英文/原始文档
├── README.CN.MD # 中文文档(本文件)
└── ADB_FIX.md # ADB 问题解决方案
```
---
## 🔌 API 参考
### Docker 命令
```bash
# 查看容器
docker ps -a | grep redroid
docker stats redroid1 redroid2
# 进入容器
docker exec -it redroid1 sh
docker exec -it redroid2 sh
# 查看日志
docker logs -f redroid1
docker logs -f redroid2 --tail 100
# 重启容器
docker restart redroid1
# 停止并删除
docker stop redroid1 redroid2
docker rm redroid1 redroid2
```
### ADB 命令参考
| 命令 | 说明 |
|------|------|
| `adb devices` | 列出连接设备 |
| `adb connect :` | 连接设备 |
| `adb disconnect :` | 断开设备 |
| `adb shell` | 进入 shell |
| `adb install ` | 安装应用 |
| `adb uninstall ` | 卸载应用 |
| `adb push ` | 推送文件 |
| `adb pull ` | 拉取文件 |
| `adb logcat` | 查看日志 |
| `adb reboot` | 重启设备 |
---
## 📝 更新日志
### v1.0.0 (2024)
- ✅ 支持双 Android 实例运行
- ✅ 提供多种连接方式(ADB、VNC、Web)
- ✅ 完整的 npm 脚本管理
- ✅ APK 自动安装工具
- ✅ 设备信息修改功能
- ✅ 屏幕查看多种方案
---
## 📄 许可证
本项目采用 [MIT License](LICENSE) 开源协议。
---
## 🔗 参考资源
- [Redroid 官方文档](https://github.com/remote-android/redroid-doc)
- [Redroid GitHub](https://github.com/remote-android/redroid-doc#redroid)
- [Docker 官方文档](https://docs.docker.com/)
- [Android Debug Bridge (ADB)](https://developer.android.com/studio/command-line/adb)
- [scrcpy 项目](https://github.com/Genymobile/scrcpy)
---
**Made with ❤️ for Android Cloud Development**