跳到主要内容
版本:0.17.0+

Rockchip-4B Android 刷机天坑指南

  1. documentation
  2. 记一次糟糕的刷机经历
    1. intro
    2. step 1. 生成 gpt.img
    3. step 2. install rkdeveloptool
    4. step 3. 基于rkdeveloptoolemmc刷机要点
    5. 基于adbscrcpy投屏
    6. 关于 sd 卡刷
    7. 其他关于 rc 的吐槽
  3. FIXED: No configuration exists for this target on this architecture. Stop.
  4. FIXED: error: 'commit_id.xml', needed by 'out/target/product/rk3399/vendor/commit_id.xml', missing and no known rule to make it
  5. FIXED: error: prebuilts/clang/host/linux-x86/: platform/prebuilts/clang/host/linux-x86 checkout
  6. FIXED: awk: line 2: function strtonum never defined
  7. FIXED: fatal error: openssl/bio.h: No such file or directory
  8. FIXED: "Creating Comm Object failed!"

documentation

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_armImage-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. 基于rkdeveloptoolemmc刷机要点

首先是认识接口与接线顺序。

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,这个具体哪个对哪个,可能还是要结合实际测试。

picture 3

而基于 rkdeveloptool 是基于 maskrom工作的,如果设备不是处于该模式,则无法基于 rkdeveloptool 对设备进行操作。

  1. 先将公对公线连上 otg 到电脑(电脑如果是 c 口,要用 usb 转 c 转接器,直接用公接 c 线到我的 mac 没反应)
  2. 按住 rc4b 的maskrom
  3. 将 rc4b 接电(这个电口既可以插插座,也可以接电脑,无所谓,用于供电的)
  4. 松开maskrom

只要是先按着maskrom键然后接电的,开发板就是进入了maskrom模式,这是要点一;

只要先接上 otg,接着就能检测到maskrom,这是要点二。

可以用watch rkdeveloptool ld(需要brew install watch)监控maskrom连接情况(接电后一秒就有反应了

picture 8

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

picture 9

这样,我们确认了已经连接上。

接下来我们要下载官方的loader用于初始化RAM。我其实在仓库根目录也看到了一个 loader:

picture 10

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

picture 11

!!!tip 解压那个zero.img.gz可以用gunzip zero.img.gz,以得到zero.img

假设当前目录结果如下:

picture 12

其中 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里有设备时可以使用投屏功能。

基于adbscrcpy投屏

访问:- Genymobile/scrcpy: Display and control your Android device 或者直接 brew/apt install scrcpy即可安装scrcpy

无需任何额外配置,在adb有效后,使用scrcpy就能看到系统效果。

picture 14

picture 13

!!!tip 目前发现,自己编译的 android 系统明显比官方打包的要好,没有抖动之类的问题,据博文猜测应该是官方打包的太旧了。

关于 sd 卡刷

其实 sd 卡刷理论上比emmc要更傻瓜一些,因为有现成的Etcher之类的软件三步烧到卡里,然后插到板子上,就可以自动启动了。

我之前花了很长时间纠结无法开机的问题,主要是因为镜像不对,而非按键之类的操作有误。

这也是卡刷的一个缺点,出了问题也不方便调试。

而我们的 rockchip-4b-plus,已经有了一块内置焊死的emmc,所以也确实没必要用 sd 卡,尽管都可以。sd 卡的话就不用去安装 rockchip 官方的 rkdeveloptool 工具。

具体参考官方说明:

picture 15

其他关于 rc 的吐槽

从今天起,只要你也吐槽 rockchip 的产品、文档,那我们就能成为朋友!

在 rc 镜像生成部分,rockdev目录下可以看到 readme 是这么写的:

picture 16

但实际上,我们根本就没有必要把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

see: - error: 'commit_id.xml', needed by 'out/target/product/rk3399/vendor/commit_id.xml', missing and no known rule to make it · Issue #2 · radxa/manifests

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

picture 1

ref:

FIXED: fatal error: openssl/bio.h: No such file or directory

sudo apt-get install aptitude
sudo aptitude install libssl-dev

picture 2

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: