rk3588 redroid scrcpy
信号再生中
2025年11月30日 11:35

使用 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 版本,非常适合挂机:

  1. 群控功能: 它可以一次性勾选所有连接的 ADB 设备,一键全部打开。

  2. 按键映射: 它可以像安卓模拟器一样,把键盘按键映射到屏幕触控点(适合玩 MOBA/FPS 游戏)。

  3. 脚本支持: 支持简单的自动点击脚本。

方案 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 需要这些模块才能运行。

  1. 检查是否已启用:

  2. grep binder /proc/filesystems

  3. grep ashmem /proc/misc

  4. 如果没开启,需要在 /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 连接并推流画面。

  1. 安装 Scrcpy: 在你的电脑(Windows/Mac)上安装 Scrcpy。

  2. 连接 RK3588:# 连接第一个窗口

  3. adb connect <RK3588的IP>:5555

  4. scrcpy -s <RK3588的IP>:5555

  5. # 连接第二个窗口

  6. adb connect <RK3588的IP>:5556

  7. scrcpy -s <RK3588的IP>:5556

这样你的电脑屏幕上就会出现多个安卓手机的窗口。

3. 游戏运行与脚本实现细节

既然系统跑起来了,怎么挂?

  1. 安装应用:

  2. 直接通过 ADB 安装 APK:

  3. adb -s <RK3588的IP>:5555 install game.apk

  4. 自动化/gua脚本:

    • 方案A (外部控制): 使用类似 MAA (Mellower/Mobile All-Assistance) 这样的PC端挂机工具。MAA 可以直接通过 ADB 连接到 Redroid 容器,识别图像并发送点击指令。

    • 方案B (内部脚本): 在安卓容器内安装“按键精灵”或 Auto.js。

    • 方案C (云手机操控): 配合 ws-scrcpy (Web版 Scrcpy),可以在浏览器里同时监控十几台“手机”的画面。

  1. 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 安装游戏和脚本。

这是一个非常极客且高性价比的“家庭版云手机机房”方案。