使用 Scrcpy 控制 Docker (Redroid) 内的 App,核心逻辑是利用 ADB over TCP。因为 Docker 容器没有物理 USB 接口,我们必须通过网络端口映射,将容器内的 ADB 服务暴露给外部,然后用 Scrcpy 远程连接。
以下是实现单路和多路控制的详细操作指南:
1. 基础原理:端口映射
Redroid 容器内部默认的 ADB 端口是 5555。
为了区分不同的 Docker 容器(即不同的“手机”),我们需要在启动容器时,将宿主机(RK3588)的不同端口映射到容器的 5555 端口。
容器 A: 宿主机 5555 -> 容器 5555
容器 B: 宿主机 5556 -> 容器 5555
容器 C: 宿主机 5557 -> 容器 5555
2. 第一步:启动容器时区分端口
在 RK3588 上运行 Docker 命令时,请务必修改 -p 参数:
启动第 1 个安卓 (App A):
docker run -itd -p 5555:5555 --name android_1 ... redroid/redroid:11.0.0-latest ...
启动第 2 个安卓 (App B):
docker run -itd -p 5556:5555 --name android_2 ... redroid/redroid:11.0.0-latest ...
启动第 3 个安卓 (App C):
docker run -itd -p 5557:5555 --name android_3 ... redroid/redroid:11.0.0-latest ...
3. 第二步:电脑端建立连接 (ADB Connect)
回到你的控制端电脑(Windows/Mac/Linux),你需要先通过 ADB 连接上这些端口。假设 RK3588 的局域网 IP 是 192.168.1.100。
打开电脑终端(CMD 或 PowerShell):
# 连接所有容器
adb connect 192.168.1.100:5555
adb connect 192.168.1.100:5556
adb connect 192.168.1.100:5557
输入 adb devices 查看连接状态,你应该能看到三个设备都在 device 状态。
4. 第三步:使用 Scrcpy 分别控制 (多路复用)
Scrcpy 支持通过 -s 参数指定序列号(即 IP:端口)来启动特定窗口。
基础控制方法(命令行启动)
你需要打开多个 CMD 窗口,或者在一个脚本中运行:
控制第一个容器:
# --window-title 用于区分窗口标题,方便你识别是哪个游戏
scrcpy -s 192.168.1.100:5555 --window-title "账号1-原神"
控制第二个容器:
scrcpy -s 192.168.1.100:5556 --window-title "账号2-微信"
控制技巧:
鼠标左键: 点击/长按。
鼠标右键: 返回键 (Back)。
鼠标中键: Home 键。
键盘输入: 直接在电脑键盘打字,容器内会同步输入(适合聊微信/QQ)。
5. 进阶:如何实现更高效的“多路挂机管理”?
如果你挂了 5 个以上的号,开 5 个 Scrcpy 窗口会非常乱。这里有两个进阶方案:
方案 A:使用 QtScrcpy (推荐用于游戏)
原版 Scrcpy 没有“键盘映射”功能(比如用 WASD 移动),只适合点点点。
QtScrcpy 是 Scrcpy 的一个第三方 GUI 版本,非常适合挂机:
群控功能: 它可以一次性勾选所有连接的 ADB 设备,一键全部打开。
按键映射: 它可以像安卓模拟器一样,把键盘按键映射到屏幕触控点(适合玩 MOBA/FPS 游戏)。
脚本支持: 支持简单的自动点击脚本。
方案 B:使用 Web 浏览器操控 (ws-scrcpy)
如果你不想在电脑上装软件,或者想通过手机浏览器远程查看挂机状态,可以在 RK3588 上部署 ws-scrcpy。
这是一个 Docker 容器,它把 Scrcpy 的画面转成 WebSocket 推送到网页上。
在 RK3588 上部署 ws-scrcpy:
# 这是一个简化的运行示例,需要根据 ws-scrcpy 的文档配置
docker run -d --net=host --name ws-scrcpy scrcpy/ws-scrcpy
部署后,直接访问 http://RK3588的IP:8000,你会看到一个网页列表,列出了所有运行中的 Redroid 容器。点击即可在浏览器里操作,非常适合监控几十个apk窗口。
6. 常见问题与解决
Q: 画面卡顿或花屏怎么办?
降低比特率和分辨率: 挂机不需要高清。
# 限制分辨率为 720p,码率 2M
scrcpy -s 192.168.1.100:5555 -m 1024 -b 2M
启用音频转发限制: Redroid 有时音频处理会消耗 CPU,如果不需要声音,可以添加 --no-audio。
Q: 游戏内无法打字?
Redroid 默认输入法可能不兼容。建议通过 ADB 安装 Google Pinyin 或 Gboard,并在 Scrcpy 设置中启用 --prefer-text.
Q: 怎么把 App 安装进不同的容器?
指定端口安装即可:
# 给第二个容器安装
adb -s 192.168.1.100:5556 install my_game.apk
在 RK3588(瑞芯微高性能 ARM 芯片)上通过 Docker 运行多个 Android 系统来实现gua游戏和 App,目前最成熟、性能最好的方案是使用 Redroid (Remote Android)。
RK3588 天生具有优势,因为它是 ARM64 架构,与安卓手机架构一致,不需要指令集转译(不像 x86 电脑运行安卓模拟器那样效率低),因此效率极高。
以下是实现这一方案的核心原理、步骤和关键技术点:
1. 核心技术原理
容器化方案 (Redroid): Redroid 是一个基于 Docker 的安卓容器方案。它不是虚拟机(VM),而是利用 Linux 容器技术共享宿主机的内核,因此启动速度极快,资源占用极低。
GPU 直通 (GPU Passthrough): 为了运行游戏,必须调用 RK3588 强大的 Mali-G610 GPU。Redroid 支持将宿主机的 GPU 驱动(/dev/mali0)映射到容器内部,实现 3D 加速。
内核模块: 安卓运行需要两个关键的 Linux 内核特性:binder (进程间通信) 和 ashmem (匿名共享内存)。RK3588 的 Linux 固件需要开启这两个模块。
2. 实现步骤详解
第一步:准备宿主机系统 (OS)
你不能使用普通的电视盒安卓系统,你需要刷入 Linux 系统。
推荐系统: Joshua-Riek 开发的 Ubuntu for Rockchip 或 Armbian。
原因: 这些系统对 RK3588 的硬件编解码和 GPU 驱动支持最好。
第二步:安装 Docker 和必要依赖
在 Linux 终端中安装 Docker:
sudo apt update
sudo apt install docker.io
第三步:加载内核模块 (Binder & Ashmem)
Redroid 需要这些模块才能运行。
检查是否已启用:
grep binder /proc/filesystems
grep ashmem /proc/misc
如果没开启,需要在 /boot/firmware/extlinux/extlinux.conf (路径视系统而定) 的内核启动参数中添加 psi=1 等参数,或者安装专门带有 android 模块的内核。
注:Joshua-Riek 的 Ubuntu 通常已经包含或容易开启这些模块。
第四步:拉取并运行 Redroid 容器 (关键步骤)
这是实现“多开”的核心。你需要为每一个游戏gua窗口运行一个 Docker 容器。
启动第一个安卓容器 (Android 11):
docker run -itd \
--memory-swappiness=0 \
--privileged --pull always \
-v /data:/data \
-p 5555:5555 \
--name redroid1 \
-v /dev/mali0:/dev/mali0 \
redroid/redroid:11.0.0-latest \
androidboot.hardware=mt6891 \
androidboot.redroid_gpu_mode=host
参数解释(重要):
-p 5555:5555: 将容器的 ADB 端口映射到主机的 5555。
-v /dev/mali0:/dev/mali0: 核心! 将 RK3588 的 GPU 映射进容器,让安卓能跑 3D 游戏。
androidboot.redroid_gpu_mode=host: 告诉安卓使用宿主机的 GPU 驱动。
--privileged: 赋予容器权限以访问硬件。
如何实现多开?
只需修改端口和容器名称即可启动第二个、第三个:
docker run -itd ... -p 5556:5555 --name redroid2 ...
第五步:连接与控制 (显示画面)
Redroid 本身没有屏幕,它是“云手机”。你需要通过 ADB 连接并推流画面。
安装 Scrcpy: 在你的电脑(Windows/Mac)上安装 Scrcpy。
连接 RK3588:# 连接第一个窗口
adb connect <RK3588的IP>:5555
scrcpy -s <RK3588的IP>:5555
# 连接第二个窗口
adb connect <RK3588的IP>:5556
scrcpy -s <RK3588的IP>:5556
这样你的电脑屏幕上就会出现多个安卓手机的窗口。
3. 游戏运行与脚本实现细节
既然系统跑起来了,怎么挂?
安装应用:
直接通过 ADB 安装 APK:
adb -s <RK3588的IP>:5555 install game.apk
自动化/gua脚本:
方案A (外部控制): 使用类似 MAA (Mellower/Mobile All-Assistance) 这样的PC端挂机工具。MAA 可以直接通过 ADB 连接到 Redroid 容器,识别图像并发送点击指令。
方案B (内部脚本): 在安卓容器内安装“按键精灵”或 Auto.js。
方案C (云手机操控): 配合 ws-scrcpy (Web版 Scrcpy),可以在浏览器里同时监控十几台“手机”的画面。
Root 权限: Redroid 自带 Root,如果游戏检测 Root,你可能需要安装 Magisk (Delta/Kitsune Mask) 来对游戏隐藏 Root 状态(Zygisk 在 Redroid 上配置稍繁琐,但可行)。
4. 性能与限制 (RK3588 的承载能力)
内存瓶颈: 这是最大的限制。
一个 Android 11 容器空载约占 400MB-800MB 内存。
运行大型 3D 游戏(如原神、崩铁)可能需要 2GB-4GB 内存。
运行 2D gua游戏(如碧蓝航线、明日方舟)约占 1GB-1.5GB。
多开数量估算 (以 16GB 版本 RK3588 为例):轻度挂机 (2D卡牌/脚本): 可以开 6-10 个 容器。
重度 3D 游戏: 只能开 2-3 个 容器(受 GPU 算力和内存限制)。
散热: 长期满载gua,RK3588 发热量很大,必须加装风扇,否则 CPU/GPU 降频会导致游戏卡顿。
总结
实现路径: RK3588 开发板 -> 刷 Ubuntu Rockchip 系统 -> 安装 Docker -> 部署 Redroid 容器 (开启 Mali GPU 直通) -> 电脑端用 Scrcpy 显示 -> ADB 安装游戏和脚本。
这是一个非常极客且高性价比的“家庭版云手机机房”方案。