🧩 瑞莎 Radxa ROCK 5B+(RK3588)单板搭建高性能安卓游戏脚本机(未完待续)
🎯 1. 目标与预算
✅ 最终目标:
- 设备搭载并稳定运行 Android 12 系统
- 设备完整支持 Google 服务框架(GMS),可运行Google Play、Gmail等应用
- 设备能够 流畅运行对图形和资源要求较高的大型安卓游戏,如《ARK: Ultimate Mobile Edition》、《原神》等
- 设备可运行 内置自动化脚本,实现刷初始号等复杂任务
- 设备可运行 自定义开机启动脚本,上电即运行预设逻辑或启动自动任务
💰 预算:
总预算上限:约¥2000
🛠️ 2. 硬件选型
为了顺利运行大型安卓手游,系统配置至少需满足以下标准:
- 内存:≥ 8GB(推荐16GB)
- 存储:≥ 250GB,需支持高速读写(读写速度至少每秒千兆级,避免加载卡顿)
🔍 采购配件:
- Radxa ROCK 5B+ 主板套装(RK3588, 16GB RAM + 电源 + 散热风扇 + 金属外壳):¥1332
- Radxa 原厂 8英寸 HD 触摸屏(800×1280 分辨率):¥366
- SanDisk 250GB NVMe SSD(M.2 接口,读取2400MB/s,写入1500MB/s):¥219
- SanDisk 64GB 高速 SD 卡 ×2(读取140MB/s):¥72
💡 小提示:适配 Radxa 安卓系统的触摸屏目前只能选官方出品的型号,亲测其它品牌基本无法兼容,基本没有选择空间。
此外,虽然 Radxa 提供了集成 eMMC 的主板套装,但相比之下,自行搭配高性能 SD 卡在价格和灵活性上更具优势。
至于为什么买了两张 SD 卡?后文会揭晓用途
📦 其他配件(若无则需额外采购):
由于系统从零开始部署,以下配件几乎必不可少:
- SD 卡读卡器:用于烧录系统镜像,市场估价¥10-30
- USB-Type A / Type C 数据线:用于连接主机进行 adb 调试,市场估价¥10-¥25
- USB 转串口线(可选):排查启动失败或系统异常时的调试利器,市场估价¥15-60
🧠 3. 软件架构
💡 设计思路
Radxa ROCK 5B+ 支持从 SD 卡、eMMC 和 NVMe(M.2 接口)启动 Android 系统。虽然官方声称支持 NVMe 启动,但经过我的实测与技术咨询,系统实际上只能安装在采用 FAT32 文件系统的 NVMe 存储设备上。
但遗憾的是,市面上主流的大容量 SSD 通常预设为 NTFS 或 ext4 格式,不支持直接安装 Android 系统,也无法从中启动。因此,我采取以下方案:
- 使用一张 64GB SD 卡 安装 Android 系统,作为启动盘;
- 系统启动后再挂载一块 250GB NVMe SSD,作为游戏数据等大文件的存储盘。
此外,原计划是在系统内部运行自动化脚本。但经过测试发现,Radxa 官方提供的 Android 镜像为开发者调试版,仅支持 adb root
,不具备系统级 root 权限,因此无法单独通过单板运行自动化脚本。
因此,我采用外部自动化控制架构:通过 PC 上的脚本远程控制 Android 系统完成任务,具体如下:
- PC 端:Python + OpenCV 图像识别 + Tesseract OCR 文字识别
- 连接方式:ADB 调试连接
- Android 端(Radxa ROCK 5B+):
- SD 卡(64GB):用于安装 Android 系统
- SSD 固态硬盘(250GB):用于存储游戏大数据包及频繁读写文件,以提升性能
🔧 性能优化策略:我将游戏的资源文件、贴图包等读写频繁的内容移至 SSD,以最大化运行效率。而用户数据、APK 文件等读取频率较低的数据保留在 SD 卡,兼顾性能与稳定性。
📊 架构图示意
🧱 4. 脚本平台搭建流程
🧩 4.1 烧录 Android 12 镜像至 SD 卡
-
下载 Radxa 官方推荐的烧录工具:
balenaEtcher-Setup-1.18.11.exe
-
下载 适用于 SD 卡启动的 Android 12 镜像压缩包:
Rock5BPlus-Android12-rkr14-SD-or-eMMC-20240705-gpt.zip
(解压后得到.img
镜像文件)。 -
将 SD 卡插入读卡器,并连接到 PC。
-
打开 balenaEtcher,按照界面提示选择
.img
文件和目标 SD 卡,开始烧录。 -
烧录完成后,不要格式化系统弹出的任何新磁盘分区(如 I:、K: 等)。
⚠️ 注意:部分 SD 卡烧录完成后,Windows 会弹出多个格式化提示框。这些分区是 Android 系统的必要组成部分,
若误格式化其中任何一个分区,将导致系统无法正常启动。
🔧 4.2 搭建 ADB 调试环境
-
将烧录好的 SD 卡插入 Radxa Rock 5B+。
-
将Nvme固态一段插入m.2接口另一端用螺丝固定
-
按照瑞莎官方的参考将单板和触摸屏通过排线链接
-
将单板和电源线链接,接通电源,系统将自动从 SD 卡启动进入 Android。
-
将单板用 USB Type-A 转 Type-C 数据线连接至 PC。
-
打开 PowerShell(或终端),执行:
adb devices
如果设备列表中出现 Rock 5B+ 的设备识别码(通常是一串随机的数字和字母组合),说明连接成功。
-
在 PC 上执行:
adb shell
然后尝试获取 root 权限:
su
成功后将进入 adb root 模式,可查看系统参数和配置。
-
(可选)若有串口转 USB 数据线,可以按照瑞莎官方提供的接线方式将单板链接到 PC ,使用 PuTTY 或其他串口工具连接串口并查看启动日志(参考官方设置波特率)。
💽 4.3 SSD 固态硬盘挂载
1. 确认系统识别到 SSD
使用 adb 连接至设备终端,获取 root 权限后执行以下命令:
ls /dev/block
若输出中包含 nvme0n1
,说明系统已成功识别到 NVMe 固态硬盘。
2. 检查是否已有分区表
由于官方镜像中未集成 vim
或 fdisk
,需借助 busybox
工具来查看磁盘状态:
busybox fdisk -l /dev/block/nvme0n1
若返回信息中含有:
Disk /dev/block/nvme0n1 doesn't contain a valid partition table
则说明该硬盘尚未创建分区,需要手动分区并格式化。
3. 使用 fdisk 创建分区
执行以下命令进入分区交互模式:
busybox fdisk /dev/nvme0n1
根据提示依次输入以下指令:
o ← 新建空的 DOS 分区表
n ← 新建分区
p ← 创建主分区
1 ← 分区号
[Enter] ← 默认起始位置
[Enter] ← 默认终止位置(使用整个磁盘)
w ← 写入并保存分区表
4. 格式化分区为 ext4 文件系统
执行以下命令格式化固态硬盘:
mkfs.ext4 /dev/block/nvme0n1p1
格式化成功后,在 /dev/block/
下应能看到新的分区节点 nvme0n1p1
。
5. 手动挂载 SSD 到指定目录
执行以下命令挂载固态硬盘:
mkdir -p /mnt/nvme
mount -t ext4 /dev/block/nvme0n1p1 /mnt/nvme
可通过访问 /mnt/nvme
目录检查挂载状态与文件系统结构是否正常。
说明:格式化后显示容量约为 228GB 属正常现象。厂商标称的 “250GB” 使用的是十进制(1GB = 1,000,000,000 字节),而操作系统采用二进制(1GiB = 1,073,741,824 字节)进行换算,二者存在单位差异。
6. 配置系统开机自动挂载
先重新挂载 /vendor
目录以获得写权限:
mount -o remount,rw /vendor
使用 busybox vi
编辑 /vendor/etc/init/hw/init.rockchip.rc
文件,在 on post-fs
阶段添加挂载命令:
mkdir -p /mnt/nvme
mount -t ext4 /dev/block/nvme0n1p1 /mnt/nvme
保存并退出。
7. 重启验证
执行以下命令重启系统:
reboot
启动后进入终端,检查 /mnt/nvme
目录是否已自动挂载成功:
ls /mnt/nvme
若能正常列出目录内容,说明 SSD 已成功自动挂载。
提示:过这种方法虽然能达到开机自动挂载 nvme 的目的,但是每次开机都会弹出 “Device Test 屡次失败” 的提示,实在烦人,估计是开发板在检测相关系统目录有没有被修改。所以我后面还是把这个挂载 nvme 的步骤添加到 nvme_bind.sh 脚本中了
🧃 4.4 部署应用(以手游《The Wolf》为例)
这里轻量手游《The Wolf》为例,记录游戏部署流程
1. 下载安装包
一般游戏安装包都是.apk
文件,可以直接使用adb install
安装
但我这里下载的是.xapk
文件,需要先进行解压处理:
- 将
.xapk
后缀修改为.zip
。 - 使用 WinRAR 或其他压缩工具解压。
解压后的文件通常包含:
- 主 APK 包(例如:
com.swiftappskom.thewolfrpg.apk
); - 配置 APK 包(例如:
config.arm64_v8a.apk
); - 其他文件如
icon.png
和manifest.json
(可忽略)。
2. 使用 ADB 安装游戏
如果是.apk
文件,直接通过adb install
安装
对于我下载的.xapk
文件,解压后通过以下命令安装:
adb install-multiple com.swiftappskom.thewolfrpg.apk config.arm64_v8a.apk
注意这条命令的参数要先跟主 APK 包,再跟配置 APK 包。
3. 理解游戏安装路径结构
安装完成后,游戏相关文件通常分布在以下几个目录:
- /data/app/:APK 安装位置;
- /data/data/:应用运行时数据(如存档、账号信息);
- /data/media/0/Android/data/:游戏下载的缓存和资源;
- /data/media/0/Android/obb/:大型资源包(如地图、贴图);
- /user_de/0/:部分延迟加载或用户解密数据。
重点:我们通常只迁移 /data/data 与 /data/media 目录的数据,因为其他目录里的文件不会影响游戏运行速度
4. 迁移游戏数据
通过以下命令将/data/data和/data/media目录的数据迁移到我们的SSD固态盘上(目标路径可以自己定):
cp -rp /data/data/com.swiftappskom.thewolfrpg /mnt/nvme/data
cp -rp /data/media/0/Android/data/com.swiftappskom.thewolfrpg /mnt/nvme/media/0/Android/data
cp -rp /data/media/0/Android/obb/com.swiftappskom.thewolfrpg /mnt/nvme/media/0/Android/obb
5. 通过 mount --bind 实现游戏数据迁移
编写 nvme_bind.sh 脚本,将游戏数据目录绑定到外部硬盘(如 NVMe):
#!/system/bin/sh
# bind game data
rm -rf /data/data/com.swiftappskom.thewolfrpg
mkdir /data/data/com.swiftappskom.thewolfrpg
mount --bind /mnt/nvme/data/com.swiftappskom.thewolfrpg /data/data/com.swiftappskom.thewolfrpg
rm -rf /data/media
mkdir /data/media
mount --bind /mnt/nvme/media /data/media
将脚本保存到 /data/local/nvme_bind.sh 并赋予执行权限:
chmod +x /data/local/nvme_bind.sh
每次开机后手动运行此脚本,以挂载游戏数据目录。之后就可以正常运行游戏。
🌼 4.5 安卓环境优化
1. 设置系统语言为中文
打开系统设置 → 【System】(系统)→ 【Languages & input】(语言和输入法)→【Languages】(语言)。
点击【Add a language】,选择中文(简体)。
添加后,长按“中文(简体)”并拖动至列表最上方,使其成为系统默认语言。
2. 设置系统时间与时区
进入系统设置 → 系统 → 日期与时间
点掉自动设置时区
点击选择时区,点击区域选择“中国”,点开时区选择“上海”
3. 更换 Launcher(启动器)
默认启动器功能简陋,建议替换为功能完整的 Nora Launcher。
在 PC 端下载 Nora Launcher APK,并使用 ADB 安装:
adb install NoraLauncher.apk
安装完成后,进入系统设置 → 应用 → 默认应用 → 主屏幕应用,将其更改为 “Nora Launcher”。
启动 Nora Launcher 后,从屏幕右侧的边栏(或底部应用抽屉)打开应用列表,长按应用图标,即可将其拖动至主屏幕以创建快捷方式。
👓 4.6 脚本环境检查
1. 手动触摸屏检查
在设备上用手进行点按、滑动等操作,同时在 PC 端执行如下命令实时查看输入事件:
adb shell getevent -lt
若能观察到 /dev/input/event*
的时间戳与触摸事件,说明触摸屏事件系统正常工作。
2. 使用 ADB 命令模拟输入操作
常用 ADB 输入命令:
- 点按指定坐标:
adb shell input tap <x> <y>
- 滑动操作:
adb shell input swipe <x1> <y1> <x2> <y2> <duration_ms>
- 输入文本:
adb shell input text "hello"
- 返回键 / Home 键等控制:
adb shell input keyevent KEYCODE_BACK
、adb shell input keyevent KEYCODE_HOME
若执行后屏幕有对应操作反馈,说明 ADB 控制功能正常。
3. 使用 Python 脚本进行自动化控制
使用 Python 脚本进行自动化控制需要确保 PC 中有 Python 环境
编写如下脚本做简单测试
import os
# tap screen function
def tap(x, y):
os.system(f"adb shell input tap {x} {y}")
# call function
tap(540, 960)
编写完成后执行脚本,如果执行后屏幕有对应操作反馈,说明 Python 脚本自动化控制功能正常。
python 中集成 OpenCV 和 Tesxtes 后基本上可以满足所有脚本调试需求了
⚠️ 5. 注意事项
🔁 绑定顺序限制
Android 系统在安装应用时不会读取提前绑定的目录。如果你在执行 adb install
前已通过 mount --bind
映射路径,系统会中断绑定并将 APK 安装到默认目录,导致绑定失效。因此,在迁移应用数据的时候必须遵循以下顺序:
- 使用系统原生目录完成应用安装;
- 安装完成后再使用
mount --bind
映射到外部存储路径。
尽管这样的部署流程十分繁琐,但目前没有别的办法。若能在 Android 镜像 源码中修改应用安装的默认路径,将更好的处理这个问题。
🧠 游戏设备识别异常
某些游戏(如《The Wolf》)在运行时会将 Radxa Rock 5B+ 识别为模拟器,并强制账号进入“模拟器服”。这是由于开发板缺乏标准手机硬件标识(如 IMEI、基带信息等)所致。
要避免这种识别行为,必须修改 Android 镜像源码 ,为设备添加完整的硬件信息模拟。
🚫 无法获取 Root 权限
我尝试使用 Magisk 替换 boot.img
获取 Root 权限,但最后失败,导致系统无法正常启动。个人认为问题主要在于:
- Magisk 无法识别开发板提供的 bootloader 文件格式;
- 系统启动引导失败,需重新刷写镜像恢复。
这说明当前设备并不完全兼容 Magisk 的常规 Root 方案。
🗂️ /vendor
分区限制问题
尽管部分 /vendor
目录内容可以通过 adb root
后挂载为可写,但存在如下限制:
/vendor
分区大部分区域仍受保护,无法直接创建非空文件或通过adb push
写入内容;- 实际上只有
/data/vendor/
子目录具备读写权限,其他如/data/local/tmp
等目录无法用于脚本存放或执行; - 向/vendor内的
.rc
脚本中添加代码时存在行数限制,即使保存成功,也可能因文件大小超出限制而被裁剪。例如向init.rockchip.init.rc
中写入第 13 行代码会被被自动截断。
我推测 Android 在启动阶段对 vendor 文件进行了硬件级写入保护和沙箱隔离,防止非授权写入。
若需实现真正的脚本控制能力,只能在 Android 镜像源码 中修改系统权限策略与挂载逻辑。
⚙️ 自定义开机脚本无法运行
经过我测试,/system, /etc, /vendor 这三个系统文件夹默认全是只读形式,即使是adb root也无法修改。
这直接导致了自定义开机脚本无法运行。
虽然可以利用adb root重新挂载vendor为可读写,但是依然存在种种限制,只能运行功能有限的脚本(比如挂载nvme)
只有修改 Android 镜像源码 重新编译后在烧写镜像才能实现自定义脚本开机运行的功能
📵 无法安装谷歌服务
我尝试以下多种方式安装 Google 服务均失败:
- 使用 Go 安装器;
- 手动提取并安装 Open GApps 中的 APK 包;
初步判断为镜像未提供必要依赖或权限配置,可能需要重新编译 Android 镜像源码 以支持 Google 框架
🤖 自动化全局脚本无法内部运行
我在尝试部署自动化控制脚本时发现,仅能通过 PC 端 adb root
的方式运行全局脚本,而无法在单板机内部独立运行全局脚本。
个人认为主要原因是 Android 的沙箱机制限制了应用之间的交互和全局文件访问权限;
因此,暂时只能使用外部主机通过 adb
接口远程调度任务。
若要在本地独立执行自动化脚本,需在 Android 镜像源码 中构建专属执行环境,并赋予必要的系统权限。
💻 触摸屏显示异常
Radxa 的单板只能适配 Radxa 提供的触摸屏,但是 Radxa 的触摸屏连接装了 Radxa 官方安卓镜像的 Radxa Rock 5B+ 单板后会出现显示异常,横屏只能显示1/3个屏幕。
可以通过 设置->显示->屏幕旋转->90 的方法转换成竖屏全屏显示,但打开横屏游戏后又会强制变回1/3个屏幕。
Radxa 提供的设置命令 adb shell setprop persist.sys.rotation.einit-1 1
也无法实现横屏全屏显示
在和 Radxa 客服进行多轮沟通后,基本上确定 Radxa 的技术人员把这个横屏只显示1/3个屏幕的 BUG 写死在了 Android 镜像源码 中,需要修改镜像源码才能实现横屏的全屏显示。
🧩 6. 后记
我之前一直接触的都是 Linux 系统,这是我第一次接触 Android 系统,给我的整体感觉就是两个字“高贵”。
本来以为开发板一定会有系统的最高权限,系统的所有文件都能修改,但是 Android 12 的系统就是特别“高贵”。
什么都不能改,什么都不能动,不仅是系统文件不能改,哪怕是放应用文件的 /data
目录,也会被沙箱隔离。
据说谷歌这么做是为了安全,很好,你往 Android 普通版里放这些可以理解,但你往 Android 开发调试版里塞这些玩意这不是欠揍吗?
我踏马调试了半个月,越调越暴躁,越改越红温。不得不承认 Android 12 系统很好的锻炼了我的心态。
现在我的开发板虽然能够把 Android 12 系统运行起来了,但是写在开头的目标还没全部实现。
回顾第五节总结的问题,大多数都和镜像源码有关。Android 12 (也可能是 Radxa 的技术人员)把太多的权限都写死在镜像源码中了,如果不能修改镜像源码,那就无法拥有 Android 12 系统的所有权限。
但是镜像源码修改了以后还得编译,而谷歌官方给出的编译环境最低条件就是16GB内存+250GB空间的 Ubuntu20.04 版本,我的PC完全满足不了这个要求。
还记得我在开头买的第二张SD卡吗?我在硬件选型的时候选的 Rock 5B+ 就是16GB内存+256GB空间的,如果我用第二张SD卡把 Rock 5B+ 的 Android 系统换成 Ubuntu 系统,那 Rock 5B+ 不就是一台小型编译服务器了吗?
而且 Rock 5B+ 自己编译出来的镜像给自己用,连交叉编译都省下了。
下一步我会安装 Rock 5B+ 的 Linux 系统,在 Linux 系统中搭建安卓镜像的编译环境, 修改并编译瑞莎官方提供的 Android 镜像源码,最后将镜像装回 Rock 5B+ 进行调试
如果我有进展了会另开一篇博客来记录。
后会有期。
📚 参考资料