Rockchip-4B Android 刷机天坑指南
- documentation
- 记一次糟糕的刷机经历
- FIXED:
No configuration exists for this target on this architecture. Stop. - FIXED:
error: 'commit_id.xml', needed by 'out/target/product/rk3399/vendor/commit_id.xml', missing and no known rule to make it - FIXED:
error: prebuilts/clang/host/linux-x86/: platform/prebuilts/clang/host/linux-x86 checkout - FIXED:
awk: line 2: function strtonum never defined - FIXED:
fatal error: openssl/bio.h: No such file or directory - FIXED:
"Creating Comm Object failed!"
documentation
✨✨✨ 核心刷机资料,包含各种工具 Rock/flash the image - Radxa Wiki
升级 XX?: Burning Firmware — Firefly Wiki
https://mega.nz/folder/gxVRiara#_ExDV9pfNpqabzDTtpN-UA
记一次糟糕的刷机经历
intro
首先关于 rc 的刷机部分,官方参考文章主要有以下:
理论上,刷对应版本就去翻对应的网页,但在 rc 这里不是这样的,rc 的文档写的,应该说相当随意,然后历史遗留痕迹太大, 不懂得维护。
从经验上看,rc 可能在持续更新,比如在 android 7 的时代写一篇 7 的刷机文档,10 的时代写了一篇 10 的刷机文档,里面总体来说,可能没有什么大错误,但是坑不少。
我恰巧目标平台是 10,10 的刷机文档竟然出乎意料地是最坑的。
比起 11 它没有给出一键刷机的指令,这也许可以接受,(其实无非就是把几个脚本合起来了而已);但比起 7 它竟然少了最后一步生成gpt.img的步骤,而在 7、11 里都是有的……我还是在花了很长时间的搜索后才在 7 的文档里找到这一步的答案。
咋还能升级升垮了呢?这是让我觉得 rc 最不专业的一点。
!!!warning 尽管 rc 每个版本都给出了分步编译的说明,u-boot -> kernel -> aosp -> img等,但是考虑到中途实在有太多步,并且他们基于(提前使用)软链接的一些设置很容易造成项目紊乱,为此我又多花了一天时间,怎么刷机都刷不过。最后还是使用一键脚本编译,然后刷机一次性通过。
所以尽管10的文档里没有给出一键刷机的说明,但是仓库里其实有的,注意项目根目录下的`build-rockpi-4b.sh`,运行仿造11的命令:`./build-rockpi-4b.sh -UACKup` 即可(不用管意思,一把梭就可以)。
step 1. 生成 gpt.img
接下来是刷机第一步(拉取代码,直到生成gpt.img)
VERSION=10
TAG=q # 10 -> q, 11 -> r
DIR=rockpi4-android-$VERSION
BRANCH=rockchip-android-$VERSION
mkdir $DIR && cd $DIR
repo init -u https://github.com/radxa/manifests.git -b $BRANCH \
-m rockchip-$TAG-release.xml
repo sync -d --no-tags -j4
./build-rockpi-4b.sh -UACKup
如果之前已经整编过,那么运行./build-xx.sh 一键编译应该只需要半个小时左右,否则就是正常安卓编译+kernel 编译时间,预留四小时吧。
在./build-xx.sh之后,期间生成 image 的过程里会把rockdev文件夹链接到根目录,也就是:
rockdev -> ./RKTools/linux/Linux_Pack_Firmware/rockdev/
而在这个rockdev目录下,又有一个Image文件夹软链接,它指向当前文件夹下正在编译的那个Image(默认有多个,比如:Image-aosp_arm、Image-RockPi4B等),我们目前的一键编译会将Image指向Image-RockPi4B。
而在该Image目录下,有一个gpt.img文件,这个就是完整的刷机包。
step 2. install rkdeveloptool
由于我们购买的 rc4b 已经焊死了一个emmc,所以我们无需额外的 sd 卡,直接基于 emmc 就可以(根据测试,官网中说的短路也是不用的)
使用emmc首先需要下载rkdevleloptool(linux 或 mac: rockchip-linux/rkdeveloptool)或者RkDevTool(windows)。
具体下载与安装也可以直接使用以下:
# mac
brew install automake autoconf libusb lsusb
# linux
sudo apt-get install -y libudev-dev libusb-1.0-0-dev dh-autoreconf
# both
git clone https://github.com/rockchip-linux/rkdeve loptool
cd rkdeveloptool
autoreconf -i
./configure
make
# global
sudo cp rkdeveloptool /usr/bin/
参考:- Rockpi4/dev/usb-install/zh cn - Radxa Wiki
step 3. 基于rkdeveloptool的emmc刷机要点
首先是认识接口与接线顺序。
rc4b 只有一个 typeC 口是用于供电的,其它四个 usb 口其中两个是 usb2.0,两个是 usb3.0(蓝色)。
两个蓝色 usb3.0 中,上面(离主板距离更高)那个是 otg 口,口后面有个开关,往板角方向掰是usb device模式,这样连接电脑后电脑可以检测到 rc4b 里面的系统(adb才有用);否则是udb host模式,用于其他用途。
rc4b 还有三个按键,按官方文档:引导 Rock PI 进入 Maskrom 模式 描述从 typeC 口上的那个按键往下的三个键分别是maskrom | recovery | reset键,但我目前测试下来第二个键才是maskrom,这个具体哪个对哪个,可能还是要结合实际测试。

而基于 rkdeveloptool 是基于 maskrom工作的,如果设备不是处于该模式,则无法基于 rkdeveloptool 对设备进行操作。
- 先将公对公线连上 otg 到电脑(电脑如果是 c 口,要用 usb 转 c 转接器,直接用公接 c 线到我的 mac 没反应)
- 按住 rc4b 的
maskrom键 - 将 rc4b 接电(这个电口既可以插插座,也可以接电脑,无所谓,用于供电的)
- 松开
maskrom键
只要是先按着maskrom键然后接电的,开发板就是进入了maskrom模式,这是要点一;
只要先接上 otg,接着就能检测到maskrom,这是要点二。
可以用watch rkdeveloptool ld(需要brew install watch)监控maskrom连接情况(接电后一秒就有反应了)

也可以用lsusb(或者lsusb 2>/dev/null抑制内部错误信息)查看是否有Fuzhou的 usb 行信息:

这样,我们确认了已经连接上。
接下来我们要下载官方的loader用于初始化RAM。我其实在仓库根目录也看到了一个 loader:

用来试了一下,发现不行,所以用官方的就好: 通过 USB 烧写镜像到 eMMC 模块:

!!!tip 解压那个zero.img.gz可以用gunzip zero.img.gz,以得到zero.img。
假设当前目录结果如下:

其中 rk3399_loader_v1.20.119.bin 是下载的官方 bin 文件,zero.img也是下载的官方空镜像,而ROCKPI-4AB-2020-10-15-11-14-gpt.img是官方打包好的安卓 10 镜像,gpt-4b.img是我们自己编译好的安卓镜像。
于是可以用以下脚本方便一键刷机/复原:
# LOADER="rk3399_loader_v1.20.119.bin"
LOADER="loader.bin"
# function
export f() {
rkdeveloptool db $LOADER
rkdeveloptool wl 0 $1
rkdeveloptool rd
}
# burn image of official packed android 10 for test
f ROCKPI-4AB-2020-10-15-11-14-gpt.img
# burn image of `gpt.img`
f gpt-4b.img
# clear image
f zero.img
可以这么做,达到清空镜像再重新安装我们的 4b 镜像:
f zero.img
f gpt-4b.img
值得注意的是,这么做之后,如果你实时监控maskrom状态(watch rkdeveloptool ld)会看到在f zero.img之后系统依旧是maskrom状态,而在f gpt-4b.img之后系统将复原(也就是说,zero.img不会中断maskrom状态。
同时,如果你也在监控adb状态(watch adb devices)会看到,在f gpt-4b.img后几秒,有一个recovery状态的设备发现,再过几秒就没了;然后开发板重启,再过几秒后,蓝灯闪烁就代表已经系统已经成功在运行,此时adb里会有一个正常的设备出现。
而当adb里有设备时可以使用投屏功能。
基于adb的scrcpy投屏
访问:- Genymobile/scrcpy: Display and control your Android device 或者直接 brew/apt install scrcpy即可安装scrcpy。
无需任何额外配置,在adb有效后,使用scrcpy就能看到系统效果。


!!!tip 目前发现,自己编译的 android 系统明显比官方打包的要好,没有抖动之类的问题,据博文猜测应该是官方打包的太旧了。
关于 sd 卡刷
其实 sd 卡刷理论上比emmc要更傻瓜一些,因为有现成的Etcher之类的软件三步烧到卡里,然后插到板子上,就可以自动启动了。
我之前花了很长时间纠结无法开机的问题,主要是因为镜像不对,而非按键之类的操作有误。
这也是卡刷的一个缺点,出了问题也不方便调试。
而我们的 rockchip-4b-plus,已经有了一块内置焊死的emmc,所以也确实没必要用 sd 卡,尽管都可以。sd 卡的话就不用去安装 rockchip 官方的 rkdeveloptool 工具。
具体参考官方说明:

其他关于 rc 的吐槽
从今天起,只要你也吐槽 rockchip 的产品、文档,那我们就能成为朋友!
在 rc 镜像生成部分,rockdev目录下可以看到 readme 是这么写的:

但实际上,我们根本就没有必要把loader copy 到什么地方去,可能是他们的脚本里自带了,也有可能是他们后来更新了。
再联系他们各大版本的文档的同步、准确性等问题……
总之,标准的天坑。
FIXED: No configuration exists for this target on this architecture. Stop.
mark::update@2022-02-25: 在编译 kernel 时,今天一直碰到这个问题。
一开始是我在回滚了 kernel 之后出现的,后来我仔细查看了 git log,发现有一个 commit 里包含很多 config.go 文件,我猜想这些文件是不能丢掉的。
我原以为,是 rk 的 git 操作没到位,一些新的文件没合到 git 里。
直到后来我才意识到,(不确定)是在 repo sync 的时候,自动生成的,当然,这个生成的一部分文件,也就属于新增文件,不在 commit 里了。
因此,当我回滚了操作,甚至直接删光 kernel 文件夹再 repo sync kernel,也不能获得那些 config 文件。
最终导致 kernel 无法编译。
总之,要么 make clean,要么 指定lunch,要么就 repo sync 重新同步一下,也没有其他办法了……终归有个办法可以用的……
FIXED: error: 'commit_id.xml', needed by 'out/target/product/rk3399/vendor/commit_id.xml', missing and no known rule to make it
It arises up when we build the AOSP, and the python is disallowed without the commit_id.xml, so just put it:
TEMPORARY_DISABLE_PATH_RESTRICTIONS=true
FIXED: error: prebuilts/clang/host/linux-x86/: platform/prebuilts/clang/host/linux-x86 checkout
ref:
FIXED: awk: line 2: function strtonum never defined
sudo apt-get install gawk

ref:
FIXED: fatal error: openssl/bio.h: No such file or directory
sudo apt-get install aptitude
sudo aptitude install libssl-dev

ref:
FIXED: "Creating Comm Object failed!"
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="2207", MODE="0666",GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
ref: