⚡瑞莎 Radxa ROCK 5B+(RK3588)单板搭建高性能安卓游戏脚本机(未完待续)

🧩 瑞莎 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 卡

  1. 下载 Radxa 官方推荐的烧录工具balenaEtcher-Setup-1.18.11.exe

  2. 下载 适用于 SD 卡启动的 Android 12 镜像压缩包Rock5BPlus-Android12-rkr14-SD-or-eMMC-20240705-gpt.zip(解压后得到 .img 镜像文件)。

  3. 将 SD 卡插入读卡器,并连接到 PC。

  4. 打开 balenaEtcher,按照界面提示选择 .img 文件和目标 SD 卡,开始烧录。

  5. 烧录完成后,不要格式化系统弹出的任何新磁盘分区(如 I:、K: 等)

⚠️ 注意:部分 SD 卡烧录完成后,Windows 会弹出多个格式化提示框。这些分区是 Android 系统的必要组成部分,
若误格式化其中任何一个分区,将导致系统无法正常启动

🔧 4.2 搭建 ADB 调试环境

  1. 将烧录好的 SD 卡插入 Radxa Rock 5B+。

  2. 将Nvme固态一段插入m.2接口另一端用螺丝固定

  3. 按照瑞莎官方的参考将单板和触摸屏通过排线链接

  4. 将单板和电源线链接,接通电源,系统将自动从 SD 卡启动进入 Android。

  5. 将单板用 USB Type-A 转 Type-C 数据线连接至 PC。

  6. 打开 PowerShell(或终端),执行:

    adb devices
    

    如果设备列表中出现 Rock 5B+ 的设备识别码(通常是一串随机的数字和字母组合),说明连接成功。

  7. 在 PC 上执行:

    adb shell
    

    然后尝试获取 root 权限:

    su
    

    成功后将进入 adb root 模式,可查看系统参数和配置。

  8. (可选)若有串口转 USB 数据线,可以按照瑞莎官方提供的接线方式将单板链接到 PC ,使用 PuTTY 或其他串口工具连接串口并查看启动日志(参考官方设置波特率)。

💽 4.3 SSD 固态硬盘挂载

1. 确认系统识别到 SSD

使用 adb 连接至设备终端,获取 root 权限后执行以下命令:

ls /dev/block

若输出中包含 nvme0n1,说明系统已成功识别到 NVMe 固态硬盘。

2. 检查是否已有分区表

由于官方镜像中未集成 vimfdisk,需借助 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.pngmanifest.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_BACKadb 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 安装到默认目录,导致绑定失效。因此,在迁移应用数据的时候必须遵循以下顺序:

  1. 使用系统原生目录完成应用安装;
  2. 安装完成后再使用 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+ 进行调试

如果我有进展了会另开一篇博客来记录。

后会有期。


📚 参考资料

瑞莎 Radxa 5B+ 官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值