安卓系列教程之ROM系统开发-百问100ask
系统:Android10.0
设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)
Android源码编译完毕之后, 就需要将编译出的二进制文件进行更新, 这些二进制我们也叫做各种镜像, 本文重点介绍如何更新镜像。
镜像更新可参考官方网站:: 更新固件介绍 — Firefly Wiki。
官网文章内容包含多种平台, 多种系统的说明, 本文更多是针对rk3399, 将官网的资料进行整理说明, 让大家能快速的直接上手操作。
Android源码编译完成之后,在rockdev/Image-xx目录下:
boot.img 包含ramdis、kernel、dtb
dtbo.img Device Tree Overlays
kernel.img includekernel,目前无法单独烧写,需要打包到boot.img内烧写
MiniLoaderAll.bin 包含一级loader
misc.img 包含recovery-wipe开机标识信息,烧写后会进行recovery
odm.img 包含android odm,包含在super.img分区内,单独烧写需要用fastboot烧写
parameter.txt 包含分区信息
pcba_small_misc.img 包含pcba开机标识信息,烧写后会进入简易版pcba模式
pcba_whole_misc.img 包含pcba开机标识信息,烧写后会进入完整版pcba模式
recovery.img 包含recovery-ramdis、kernel、dtb
resource.img 包含dtb,kernel和uboot阶段的log及uboot充电logo,目前无法单独烧写,需要打包到boot.img内烧写
super.img 包含odm、vendor、system分区内容
system.img 包含android system,包含在super.img分区内,单独烧写需要同fastboot烧写
trust.img 包含BL31、BL32
uboot.img 包含uboot固件
vbmeta.img 包含avb校验信息,用于AVB校验
vendor.img 包含android vendor,包含在super.img分区内,单独烧写需要同fastboot烧写
update.img 包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包
其实update.img其实就是源码编译出来的ROC-RK3399-PC-PLUS_Android10_HDMI_211112.img, 可以通过如下工具进行拆解,下载地址:
Firefly | 让科技更简单,让生活更智能
得到firefly-rk3399-linux-repack.tgz, 在linux主机上进行解压得到:
ldswfun@android:/mnt/ext-disk2/RK/unpack/firefly-rk3399-linux-repack$ ls
bin pack.sh Readme.md unpack.sh
把官方发布的固件或者自己编译的镜像拷贝到firefly-rk3399-linux-repack,重命名为update.img , 执行unpack.sh
ldswfun@android:/mnt/ext-disk2/RK/unpack/firefly-rk3399-linux-repack$ ./unpack.sh
start to unpack update.img...
********RKImageMaker ver 1.66********
Unpacking image, please wait...
Exporting boot.bin
Exporting firmware.img
Unpacking image success.
Android Firmware Package Tool v1.65
Check file... OK
------- UNPACK ------
package-file 0x0000000000000800 0x00000000000002B5
Image/MiniLoaderAll.bin 0x0000000000001000 0x000000000005F94E
Image/parameter.txt 0x0000000000061000 0x0000000000000354
Image/trust.img 0x0000000000061800 0x0000000000400000
Image/uboot.img 0x0000000000461800 0x0000000000400000
Image/misc.img 0x0000000000861800 0x000000000000C000
Image/boot.img 0x000000000086D800 0x0000000001A4E800
Image/dtbo.img 0x00000000022BC000 0x000000000000026F
Image/vbmeta.img 0x00000000022BC800 0x0000000000001000
Image/recovery.img 0x00000000022BD800 0x00000000023EA800
Image/super.img 0x00000000046A8000 0x00000000592E48E0
Image/oem.img 0x000000005D98D000 0x0000000000A3013C
Unpack firmware OK!
------ OK ------
Unpacking update.img OK.
Press any key to quit:
解包完成后,生成的文件在output目录下:
ldswfun@android:/mnt/ext-disk2/RK/unpack/firefly-rk3399-linux-repack$ tree output/
output/
├── Image
│ ├── boot.img
│ ├── dtbo.img
│ ├── misc.img
│ ├── oem.img
│ ├── recovery.img
│ ├── super.img
│ ├── trust.img
│ ├── uboot.img
│ └── vbmeta.img
├── MiniLoaderAll.bin
├── package-file
└── parameter.txt
通过Androidtool_2.71工具启动的界面,大体可以看到各个镜像将会烧录到哪些位置。
固件文件一般有两种:
针对上面两种固件更新, 其实都是通过相关的手段进行烧录, 而手段主要是通过 USB线烧,或者通过SD/TF卡烧录方式来完成, SD/TF卡只能烧录单个统一镜像, USB线刷是可以完成上面两种。
注意:如果你的开发板将SD/TF卡作为主存储(比如我的开发板), 是无法使用线刷的, 也就是说,只能烧录单个统一镜像,不能更新单个分区。
因为只能烧录单个统一固件, 请参考:
Android系统10 RK3399 init进程启动(四) RK3399开发板运行官方镜像_ldswfun的专栏-CSDN博客
注意:1,若没有emmc存储的开发板,比如tf卡存储, 以下方法无法适用。
2,如果需要局部更新,比如只更新boot.img, 需要有个前提,就是整体镜像必须先烧录一次。
环境: window系统 + RK USB驱动 + 烧写上位机工具Androidtool_2.71
官方参考: 升级固件 — Firefly Wiki
下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动
设备进入升级模式的方式如下:
先断开电源适配器连接:
USB 一端连接主机,Type-C 一端连接开发板 Type-C 母口
按住设备上的 RECOVERY (恢复)键并保持
接上电源
大约两秒钟后,松开 RECOVERY 键
主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,则需要返回上一步重新安装驱动。
使用Androidtool_2.71烧写Android10或Android9固件时使用默认配置即可。
Androidtool启动会如下显示(按照步骤2操作的效果,如果正常启动, 会显示没有发现设备)
切换至【升级固件页】。
按【固件按钮】,打开要升级的【固件文件】。升级工具会显示详细的固件信息。
按【升级按钮】开始升级。
如果升级失败,可以尝试先按擦除 Flash 按钮来擦除 Flash,然后再升级。一定要根据《使用USB线烧写须知(重要)》进行擦除烧写
注意:如果你烧写的固件 laoder 版本与原来的机器的不一致,请在升级固件前先执行擦除 Flash 。
步骤如下:
切换至下载【镜像页】。
勾选需要烧录的分区,可以多选。
确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。
点击【执行】按钮开始升级,升级结束后设备会自动重启。
下载 Linux_Upgrade_Tool (系统是 Android8.1则需要 Linux_Upgrde_Tool_for_android8.1), 并按以下方法安装到系统中,方便调用:
unzip Linux_Upgrade_Tool_xxxx.zip cd Linux_UpgradeTool_xxxx sudo mv upgrade_tool /usr/local/bin sudo chown root:root /usr/local/bin/upgrade_tool sudo chmod a+x /usr/local/bin/upgrade_tool
烧写统一固件 update.img:
sudo upgrade_tool uf update.img
烧写单独镜像:
sudo upgrade_tool di -b boot.img sudo upgrade_tool di -dtbo dtbo.img sudo upgrade_tool di -misc misc.img sudo upgrade_tool di -parameter parameter.txt sudo upgrade_tool di -r recovery.img sudo upgrade_tool di -super super.img sudo upgrade_tool di -trust trust.img sudo upgrade_tool di -uboot uboot.img sudo upgrade_tool di -vbmeta vbmeta.img
如果因 flash 问题导致升级时出错,可以尝试低级格式化、擦除 nand flash:
sudo upgrade_tool lf update.img # 低级格式化 sudo upgrade_tool ef update.img # 擦除
对于更新镜像, 能进行部分镜像更新那是最好, 没有的话,只能乖乖的更新整个镜像, 相对来说,花的时间会更多些。