Android系统10 RK3399 init进程启动(六) 镜像更新

 配套系列教学视频链接:

      安卓系列教程之ROM系统开发-百问100ask

说明

系统:Android10.0

设备: FireFly RK3399 (ROC-RK3399-PC-PLUS)

前言

        Android源码编译完毕之后, 就需要将编译出的二进制文件进行更新, 这些二进制我们也叫做各种镜像, 本文重点介绍如何更新镜像。


镜像更新可参考官方网站:: 更新固件介绍 — Firefly Wiki。

官网文章内容包含多种平台, 多种系统的说明, 本文更多是针对rk3399, 将官网的资料进行整理说明, 让大家能快速的直接上手操作。

一, 镜像整体介绍

Android源码编译完成之后,在rockdev/Image-xx目录下:

Android系统10 RK3399 init进程启动(六) 镜像更新_第1张图片

  • 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拆分

其实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工具启动的界面,大体可以看到各个镜像将会烧录到哪些位置。

Android系统10 RK3399 init进程启动(六) 镜像更新_第2张图片

三, 更新方式

固件文件一般有两种:

  1. 单个统一固件:统一固件是由分区表、bootloader、uboot、kernel、system等所有文件打包合并成的单个文件。Firefly正式发布的固件都是采用统一固件格式,升级统一固件将会更新主板上所有分区的数据和分区表,并且擦除主板上所有数据。
  2. 多个分区镜像: 即各个功能独立的文件,如分区表、bootloader、kernel等,在开发阶段生成。独立分区镜像可以只更新指定的分区,而保持其它分区数据不被破坏,在开发过程中会很方便调试。

针对上面两种固件更新, 其实都是通过相关的手段进行烧录, 而手段主要是通过 USB线烧,或者通过SD/TF卡烧录方式来完成, SD/TF卡只能烧录单个统一镜像, USB线刷是可以完成上面两种。

注意:如果你的开发板将SD/TF卡作为主存储(比如我的开发板), 是无法使用线刷的, 也就是说,只能烧录单个统一镜像,不能更新单个分区。

四, SD/TF卡更新

因为只能烧录单个统一固件, 请参考:

Android系统10 RK3399 init进程启动(四) RK3399开发板运行官方镜像_ldswfun的专栏-CSDN博客

五, USB线更新系统(只针对带EMMC存储的情况)

注意:1,若没有emmc存储的开发板,比如tf卡存储, 以下方法无法适用。

2,如果需要局部更新,比如只更新boot.img, 需要有个前提,就是整体镜像必须先烧录一次。

环境: window系统 + RK USB驱动 + 烧写上位机工具Androidtool_2.71

官方参考: 升级固件 — Firefly Wiki 

1, 安装RK USB驱动

下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动

Android系统10 RK3399 init进程启动(六) 镜像更新_第3张图片

2, 连接设备

设备进入升级模式的方式如下:

先断开电源适配器连接:

USB 一端连接主机,Type-C 一端连接开发板 Type-C 母口

按住设备上的 RECOVERY (恢复)键并保持

接上电源

大约两秒钟后,松开 RECOVERY 键

主机应该会提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,则需要返回上一步重新安装驱动。

Android系统10 RK3399 init进程启动(六) 镜像更新_第4张图片

3, 烧写统一固件

使用Androidtool_2.71烧写Android10或Android9固件时使用默认配置即可。

Androidtool启动会如下显示(按照步骤2操作的效果,如果正常启动, 会显示没有发现设备)

 Android系统10 RK3399 init进程启动(六) 镜像更新_第5张图片

切换至【升级固件页】。

按【固件按钮】,打开要升级的【固件文件】。升级工具会显示详细的固件信息。

按【升级按钮】开始升级。

如果升级失败,可以尝试先按擦除 Flash 按钮来擦除 Flash,然后再升级。一定要根据《使用USB线烧写须知(重要)》进行擦除烧写

注意:如果你烧写的固件 laoder 版本与原来的机器的不一致,请在升级固件前先执行擦除 Flash 

Android系统10 RK3399 init进程启动(六) 镜像更新_第6张图片

Android系统10 RK3399 init进程启动(六) 镜像更新_第7张图片

 4, 烧写分区映像,适合部分烧录文件

步骤如下:

切换至下载【镜像页】。

勾选需要烧录的分区,可以多选。

确保映像文件的路径正确,需要的话,点路径右边的空白表格单元格来重新选择。

点击【执行】按钮开始升级,升级结束后设备会自动重启。

Android系统10 RK3399 init进程启动(六) 镜像更新_第8张图片

5, Linux的烧录方式

下载 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	# 擦除

六, 总结

对于更新镜像, 能进行部分镜像更新那是最好, 没有的话,只能乖乖的更新整个镜像, 相对来说,花的时间会更多些。

你可能感兴趣的:(Android系统,RK3399,Android底层开发)