redroid
约 2963 字大约 10 分钟
2026-08-27
在飞牛 NAS 系统中使用 redroid 容器运行安卓应用,实现轻量化的安卓虚拟化方案。
背景与动机
redroid(Remote Android)是一个在 Docker 容器中运行 Android 系统的开源项目。相比传统的安卓模拟器或虚拟机,redroid 具有显著优势:
为什么选择 redroid
- 轻量高效:容器化部署,资源占用远低于虚拟机
- 原生性能:使用 Linux 内核运行 Android,性能接近原生
- 网络桥接:容器直接接入局域网,无需额外 NAT
- 易于管理:Docker 命令统一管理,备份恢复简单
- 多实例:可同时运行多个安卓实例,隔离互不干扰
典型应用场景
- 在 NAS 上运行安卓应用(如微信、支付宝)
- 安卓应用自动化测试
- 作为媒体服务的安卓客户端
- 搭建远程安卓桌面
前置知识
本文假设你已具备:
- fnOS 基础使用经验
- Docker 和 Docker Compose 基本概念
- 了解安卓系统基础
方案对比
在 fnOS 上运行安卓应用有多种方案:
| 方案 | 资源占用 | 性能 | 复杂度 | 适用场景 |
|---|---|---|---|---|
| redroid | 低 | 中高 | 中 | 服务器部署、自动化 |
| 虚拟机(BlissOS) | 高 | 高 | 高 | 大屏游戏、桌面使用 |
| 模拟器 | 中 | 低 | 低 | 临时使用、开发测试 |
redroid 最适合:在 NAS 环境中持续运行安卓服务,资源占用可控。
环境准备
系统要求
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 2 核 | 4 核+(支持虚拟化扩展) |
| 内存 | 4 GB | 8 GB+ |
| 存储 | 20 GB | 50 GB+ |
| 内核 | Linux 5.0+ | Linux 5.10+ |
确认 fnOS Docker 环境
fnOS 内置 Docker 支持,登录 fnOS Web 界面确认:
- 进入「应用中心」
- 确认 Docker 服务已启用
- 如未启用,点击启用并启动服务
或通过 SSH 连接到 fnOS,验证 Docker 版本:
docker --version
docker compose version安装 binder_linux 驱动(推荐)
redroid 运行需要 Linux 内核的 binder 和 ashmem 模块支持。fnOS 应用商店提供了专用驱动包,安装非常方便。
通过应用商店安装:
- 登录 fnOS Web 界面
- 进入「应用中心」→ 搜索
binder_linux - 点击安装,等待安装完成
- 安装后驱动会自动加载
验证驱动是否生效:
# 检查 binder 设备
ls -l /dev/binderfs /dev/binder 2>/dev/null
# 检查内核模块
lsmod | grep binder如果看到 /dev/binderfs 或 /dev/binder 设备文件,说明驱动已正确加载。
提示:通过应用商店安装的驱动会随系统启动自动加载,无需手动配置。
手动检查内核支持(备选)
如果应用商店没有提供 binder_linux 驱动,可手动检查内核是否原生支持:
# 检查内核配置
zcat /proc/config.gz 2>/dev/null | grep -E "BINDER|ASHMEM" || \
grep -E "BINDER|ASHMEM" /boot/config-$(uname -r) 2>/dev/null如果显示 CONFIG_ANDROID_BINDERFS=y 和 CONFIG_ASHMEM=y,说明内核支持良好。
若内核不支持,可尝试手动挂载:
mkdir -p /dev/binderfs
mount -t binder binder /dev/binderfs安装步骤
步骤一:创建配置目录
通过 SSH 连接到 fnOS,创建工作目录:
# 创建 redroid 配置目录
mkdir -p /volume1/docker/redroid/data
# 进入目录
cd /volume1/docker/redroid注意:
/volume1是 fnOS 默认存储路径,根据你的实际配置调整。
步骤二:创建 Docker Compose 配置
创建 docker-compose.yml 文件:
cat > docker-compose.yml << 'EOF'
version: '3.8'
services:
redroid:
image: redroid/redroid:13.0.0-latest
container_name: redroid13
tty: true
stdin_open: true
privileged: true
devices:
- /dev/dri
- /dev/binder
network_mode: host
volumes:
- ./data:/data
environment:
- TZ=Asia/Shanghai
command:
- androidboot.redroid_gpu_mode=host
- androidboot.use_memfd=1
- androidboot.redroid_width=1080
- androidboot.redroid_height=1920
- androidboot.redroid_dpi=320
restart: unless-stopped
EOF配置参数说明
| 参数 | 说明 | 推荐值 |
|---|---|---|
redroid_width | 屏幕宽度(像素) | 1080 |
redroid_height | 屏幕高度(像素) | 1920 |
redroid_dpi | 屏幕密度 | 320 |
redroid_gpu_mode | GPU 加速模式 | guest(软件渲染)或 host(硬件加速) |
可选:启用 GPU 硬件加速
如果你的 fnOS 有 Intel 核显或 NVIDIA 显卡,可启用 GPU 加速:
Intel 核显(推荐):
services:
redroid:
image: redroid/redroid:11.0.0-latest
privileged: true
devices:
- /dev/dri:/dev/dri
command: >
androidboot.use_memfd=1
androidboot.redroid_gpu_mode=host
androidboot.redroid_width=1080
androidboot.redroid_height=1920NVIDIA 显卡:
需要安装 nvidia-docker,并添加:
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 1
capabilities: [gpu]步骤三:启动 redroid 容器
在配置目录下执行:
# 拉取镜像(首次需要较长时间)
docker compose pull
# 启动容器
docker compose up -d
# 查看启动日志
docker compose logs -f看到 Android is ready 表示启动成功。按 Ctrl + C 退出日志查看。
步骤四:验证运行状态
检查容器状态:
docker ps | grep redroid输出应显示容器状态为 Up。
验证 ADB 连接:
# 安装 adb 工具(如果没有)
apt install -y android-tools-adb
# 连接到 redroid
adb connect localhost:5555
# 检查设备列表
adb devices输出应显示 localhost:5555 设备。
连接与使用
方式一:ADB 远程连接
从局域网内任意设备连接:
# 将 localhost 替换为 fnOS 的 IP 地址
adb connect 192.168.1.100:5555连接后可安装应用:
# 安装 APK
adb install /path/to/app.apk
# 启动应用
adb shell am start -n com.package.name/.MainActivity方式二:Web 投屏访问(需额外部署)
redroid 官方镜像不包含 Web VNC 功能,如需通过浏览器访问安卓界面,可部署第三方项目 emptysuns/scrcpy-web。
部署 scrcpy-web 容器:
在与 redroid 同一网络下创建 docker-compose.yml:
services:
scrcpy-web:
image: emptysuns/scrcpy-web:latest
container_name: scrcpy-web
ports:
- "8000:8000"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- SCRCPY_CONTAINER=redroid13
restart: unless-stopped启动后访问:http://fnOS_IP:8000
注意:scrcpy-web 需要访问 Docker 守护进程,存在一定安全风险,建议仅在可信网络中使用。
方式三:scrcpy 投屏(推荐)
scrcpy 是高性能的安卓投屏工具,通过 USB 或网络连接显示安卓屏幕。
安装 scrcpy(在客户端机器上):
# Ubuntu/Debian
sudo apt install scrcpy
# macOS
brew install scrcpy
# Windows
scoop install scrcpy连接并投屏:
# 先 ADB 连接
adb connect 192.168.1.100:5555
# 启动投屏
scrcpy -s 192.168.1.100:5555scrcpy 特点:
- 低延迟高清投屏
- 支持键盘鼠标操作
- 支持剪贴板同步
- 支持文件拖拽安装
方式四:安装安卓应用
通过 ADB 安装:
# 从本地安装 APK
adb -s 192.168.1.100:5555 install app.apk
# 从网络下载并安装
adb -s 192.168.1.100:5555 install https://example.com/app.apk通过应用商店安装:
在 redroid 中安装第三方应用商店(如 F-Droid、APKPure):
# 下载 F-Droid
wget https://f-droid.org/F-Droid.apk
# 安装
adb install F-Droid.apk进阶配置
多实例部署
可同时运行多个 redroid 实例,分配不同端口:
services:
redroid11:
image: redroid/redroid:11.0.0-latest
container_name: redroid11
privileged: true
ports:
- "5555:5555"
volumes:
- ./data11:/data
restart: unless-stopped
redroid12:
image: redroid/redroid:12.0.0-latest
container_name: redroid12
privileged: true
ports:
- "5556:5555"
volumes:
- ./data12:/data
restart: unless-stopped启动后分别连接:
adb connect 192.168.1.100:5555 # Android 11
adb connect 192.168.1.100:5556 # Android 12ARM 应用兼容性
redroid 运行在 x86 架构,部分 ARM 应用需要转译层。
安装 libhoudini(ARM 转译):
# 进入容器
docker exec -it redroid11 bash
# 在容器内下载并安装 libhoudini
# 具体方法参考 redroid 官方文档注意:ARM 转译会带来性能损失,尽量选择 x86 版本应用。
网络模式调整
默认使用桥接网络,如需 redroid 直接接入局域网:
services:
redroid:
image: redroid/redroid:11.0.0-latest
network_mode: host # 使用主机网络使用主机网络时,无需端口映射,但端口冲突需注意。
数据持久化与备份
redroid 数据存储在 ./data 目录,备份只需复制该目录:
# 停止容器
docker compose stop
# 备份数据
tar -czf redroid-backup-$(date +%Y%m%d).tar.gz ./data
# 重启容器
docker compose start恢复时解压到对应目录即可。
开机自启
docker-compose 已配置 restart: unless-stopped,fnOS 重启后容器会自动启动。
验证:
docker inspect redroid11 | grep RestartPolicy输出应显示 "Policy": "unless-stopped"。
性能优化
资源限制
为避免 redroid 占用过多资源,可设置资源限制:
services:
redroid:
image: redroid/redroid:11.0.0-latest
deploy:
resources:
limits:
cpus: '2.0'
memory: 4G
reservations:
cpus: '1.0'
memory: 2G降低分辨率
降低分辨率可显著减少资源占用:
command: >
androidboot.redroid_width=720
androidboot.redroid_height=1280
androidboot.redroid_dpi=240禁用不必要服务
在安卓中禁用不需要的系统应用:
# 进入 adb shell
adb shell
# 禁用应用
pm disable-user --user 0 com.android.chrome
pm disable-user --user 0 com.android.vending日志清理
安卓日志会占用存储空间,定期清理:
# 进入容器
docker exec -it redroid11 bash
# 清理日志
logcat -c
rm -rf /data/misc/logd/*常见问题与解决方案
问题一:容器启动失败
现象:docker compose up -d 后容器反复重启
原因:内核不支持 binder 或驱动未正确加载
解决方案:
首选方案:通过 fnOS 应用商店安装 binder_linux 驱动
- 进入「应用中心」搜索并安装
binder_linux - 安装完成后重启系统
- 验证驱动加载:
ls -l /dev/binderfs
备选方案:手动检查和挂载
# 检查日志
docker compose logs
# 确认内核支持
ls -l /dev/binderfs
# 如果不存在,尝试手动挂载
mkdir -p /dev/binderfs
mount -t binder binder /dev/binderfs如果仍无法解决,可能需要升级内核或使用支持 binder 的发行版。
问题二:ADB 连接失败
现象:adb connect 提示连接拒绝或超时
原因:防火墙阻止或端口未正确映射
解决方案:
# 检查容器端口
docker port redroid11
# 检查防火墙状态(fnOS)
sudo ufw status
sudo ufw allow 5555/tcp
# 确认 ADB 服务运行
docker exec redroid11 getprop | grep adb问题三:应用闪退或无法安装
现象:安装 APK 成功但启动闪退
原因:应用依赖 ARM 架构或特定谷歌服务
解决方案:
- 安装 ARM 转译层(libhoudini)
- 安装谷歌服务框架(如 microG)
- 寻找 x86 版本替代应用
问题四:画面卡顿或延迟高
现象:scrcpy 或 VNC 显示卡顿
原因:资源不足或未启用 GPU 加速
解决方案:
- 增加 CPU 核心数和内存
- 启用 GPU 硬件加速
- 降低分辨率和 DPI
- 使用有线网络而非 WiFi
问题五:存储空间不足
现象:无法安装更多应用或存储提示满
原因:数据目录空间不足
解决方案:
# 检查存储使用
docker exec redroid11 df -h
# 清理缓存
docker exec redroid11 rm -rf /data/data/*/cache/*
# 扩容:修改挂载到更大的存储卷问题六:时间显示错误
现象:安卓系统时间不正确
原因:时区配置错误
解决方案:
# 进入容器设置时区
docker exec -it redroid11 bash
setprop persist.sys.timezone Asia/Shanghai或在 docker-compose.yml 中设置环境变量:
environment:
- TZ=Asia/Shanghai版本选择
redroid 提供多个 Android 版本镜像:
| 镜像标签 | Android 版本 | 特点 |
|---|---|---|
redroid:10.0.0-latest | Android 10 | 稳定,兼容性好 |
redroid:11.0.0-latest | Android 11 | 平衡选择(推荐) |
redroid:12.0.0-latest | Android 12 | 新特性,部分应用不兼容 |
redroid:13.0.0-latest | Android 13 | 最新,可能有兼容性问题 |
选择建议:
- 稳定优先:Android 10 或 11
- 尝鲜新特性:Android 12 或 13
- 应用兼容性:根据目标应用要求选择
安全建议
- 限制外网访问:不要将 ADB 端口暴露到公网
- 使用防火墙:仅允许信任 IP 访问
- 定期更新:关注 redroid 安全更新
- 数据备份:定期备份重要应用数据
- 隔离运行:使用独立容器,避免与其他服务混用
总结
redroid 为 fnOS 提供了轻量级的安卓虚拟化方案,适合在 NAS 环境中持续运行安卓服务。
核心要点:
- 内核需支持 binder 和 ashmem
- 特权容器是运行前提
- ADB 和 scrcpy 是主要交互方式
- GPU 加速可显著提升性能
- ARM 应用需安装转译层
下一步建议:
- 配置自动化脚本管理应用
- 探索 redroid API 远程控制
- 结合 Home Assistant 实现智能家居控制
- 部署多实例隔离不同用途
参考资源
版本记录:v1.0 | 更新于 2026-08-27 | 适用于 fnOS 最新版
