瑞芯微Rockchip开发者社区
直播中

杨雪

7年用户 1160经验值
私信 关注
[问答]

如何对Android源码编译的二进制文件进行更新呢

如何对Android源码编译的二进制文件进行更新呢?有哪些操作步骤?

回帖(1)

李童

2022-3-4 14:21:04
一, 镜像整体介绍


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


其实update.img其实就是源码编译出来的ROC-RK3399-PC-PLUS_Android10_HDMI_211112.img, 可以通过如下工具进行拆解,




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





三, 更新方式


固件文件一般有两种:



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

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

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

四, SD/TF卡更新


因为只能烧录单个统一固件,

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


注意:因本人没有emmc存储的开发板, 故以下内容并未验证, 只作为整理。

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



1, 安装RK USB驱动


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





2, 连接设备




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

先断开电源适配器连接:

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

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

接上电源

大约两秒钟后,松开 RECOVERY 键


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



3, 烧写统一固件


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

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





切换至【升级固件页】。

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

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

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

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




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


步骤如下:



切换至下载【镜像页】。

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

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

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




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

六, 总结


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

更多回帖

发帖
×
20
完善资料,
赚取积分