安卓升级包的制作以及解析升级

1.安卓升级包目录结构组成

解压安卓升级包后目录结构:
(图中是用vs code打开升级包文件结构图,升级包中多出来的arm.img,lk.img等镜像是mtk的一些定制化,安卓原生的升级包一般含有system.img,boot.img等镜像文件而已)
在这里插入图片描述

2.安卓升级包解析升级流程

从上面安卓升级包的目录结构中可以看出,有两个文件
在这里插入图片描述
目录结构为:

/META-INF/com/google/android/updater-script
/META-INF/com/google/android/update-binary

这两个文件就是用来升级安卓升级包中的文件的,主要任务就是将其升级包的,updater-script是升级脚本,通过Edify语言描述升级的逻辑,update-binary是一个二进制Linux程序,相当于解析脚本的解析器,主要是解析升级脚本updater-script,解析成recovery识别的升级接口
将升级包的system.img,boot.img等镜像进行升级。
升级框架如下图:
在这里插入图片描述

3.安卓升级包的制作过程

知道安卓升级包的升级流程以及基本原理。主要也就是两个文件以及镜像文件(system.img,boot.img等)。那么在编译过程中这些安卓升级包文件是如何制作的呢?具体流程如下:

在这里插入图片描述
在 make otapackage 编 译 的 时 候 , NDK 会 把 所 有 升 级 包 需 要 的 资 源 放
在./out/target/product/($PLATFORM)/obj/PACKING/target_files_intermediates/一个具体编译时间的文件夹内,并将此文件压缩 zip 格式,并将此文件压缩 zip 格式。最终利用 python 脚本ota_from_target_files.py 来生成升级包。ota_from_target_files.py脚本是两个动作:
(1)将需要升级的镜像打包到升级包中去(recovery.img,boot.img等,注意system这里是一block形式升级需要一系列的转换升级,反正这里我们看常规的image镜像便可)
(2)利用ota_from_target_files.py自动生成升级描述updater-script升价描述脚本,并把脚本解析器update-binary以及升级脚本打包到升级包中。

4.mtk客制化打包升级

(1)mtk的打包升级在上面的打包基础流程上添加了自己的打包逻辑
首先mtk利用脚本mt_ota_preprocess.py会将需要升级的镜像以及ota_update_list.txt打包到资源包当中,即./out/target/product/($PLATFORM)/obj/PACKING/target_files_intermediates/下的中间包。ota_update_list.txt描述镜像名字以及挂载节点名称。然后mt_ota_from_target_files.py脚本会利用ota_update_list.txt中的信息模仿ota_from_target_files.py一样的逻辑把资源包中需要升级的镜像文件打包到升级包中去,并且添加脚本升级逻辑。

注意:在比较新的mtk适配的安卓版本当中(例如安卓P)mt_ota_from_target_files.py会被改为releasetools.py.当中的逻辑都是一样的。

(2)mt_ota_preprocess.py版本脚本
调用:

 #路径:build/core/Makefile
 @# Copy raw images which need OTA updates from out folder to zip_root/IMAGES folder
   $(hide) BOARD_AVB_ENABLE="$(BOARD_AVB_ENABLE)" AB_OTA_UPDATER="$(AB_OTA_UPDATER)" AB_OTA_PARTITIONS="$(AB_OTA_PARTITIONS)" $(TARGET_RELEASETOOLS_EXTENSIONS)/mt_ota_preprocess.py $(zip_root) $(PRODUCT_OUT)      $(PRODUCT_OUT)/ota_update_list.txt

脚本路径:

vendor/mediatek/proprietary/scripts/releasetools/mt_ota_preprocess.py

脚本流程:
在这里插入图片描述
mt_ota_preprocess.py执行的流程就在out/target/product/xxx/xxx_Android_scatter.txt当中获取支持升级的分区信息,支持升级升级包升级的is_upgradable会为ture,否则为flase。xxx_Android_scatter.txt分区描述文本主要通过device/mediatek/build/build/tools/ptgen/xxx/partition_table_xxx_emmc.csv通过解析工具编译获得。xxx代表具体的芯片平台,例如mt6623这样子。获取到is_upgradable为ture的分区会匹配挂载表fstab中的具体挂载信息,其中最主要的就是挂载节点,这让recovery升级的时候知道写到具体分区节点去。挂载表的信息在vendor/mediatek/proprietary/hardware/fstab/xxx/fstab.in.xxx中描述。然后将获取的信息通过的镜像名字—镜像分区的一个map形式添加到map数组当中去,最后通过copy_file将map数组中对应的镜像文件一一拷贝到中间包文件当中去,并生产ota_update_list.txt文件,该文件也会被拷贝到中间包文件当中去。

(2)mt_ota_from_target_files.py(releasetool.py)脚本
在mtk打包升级包脚本中因为安卓源码不一样,android o或者android o以下是mt_ota_from_target_files.py,android p则是releasetool.py,具体可能是因为平台而异把。无论mt_ota_from_target_files.py还是releasetool.py,核心逻辑都没有改变,只是编译获取的时候稍微不同。

路径:

/mediatek/proprietary/scripts/releasetools/

mt_ota_from_target_files.py版本调用:

     #路径:./build/core/Makefile
     #当中-s代表外部执行文件mt_ota_from_target_files
   ./build/tools/releasetools/ota_from_target_files -v \
   --block \
   --extracted_input_target_files $(patsubst %.zip,%,$(BUILT_TARGET_FILES_PACKAGE)) \
   --no_time_check \
   -p $(HOST_OUT) \
   -k $(KEY_CERT_PAIR) \
   -s $(OTA_TOOL_EXTENSION)/mt_ota_from_target_files \
   $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
   $(BUILT_TARGET_FILES_PACKAGE) $@

releasetool.py版本调用

#路径:build/make/tools/releasetools/ota_from_target_files.py
970   if OPTIONS.device_specific is None:
1971     from_input = os.path.join(OPTIONS.input_tmp, "META", "releasetools.py")
1972     if os.path.exists(from_input):
1973       print("(using device-specific extensions from target_files)")
1974       OPTIONS.device_specific = from_input
1975     else:
1976       OPTIONS.device_specific = OPTIONS.info_dict.get("tool_extensions")

最终无论releasetool还是mt_ota_from_target_files都是在ota_from_target_files.py中调用

#路径:build/make/tools/releasetools/ota_from_target_files.py
#调用releasetool.py中执行mtk整包升级中的打包逻辑
 device_specific.FullOTA_InstallEnd()

流程:
在这里插入图片描述

mt_ota_from_target_files.py(releasetool.py)脚本会利用ota_update_list.txt中的信息模仿ota_from_target_files.py一样的逻辑把资源包中需要升级的镜像文件打包到升级包中去,并且添加脚本升级逻辑。

5.如何添加新的镜像分区到升级包中

从上面的mtk流程看出,如果需要添加新的分区升级,也就是需要将分区镜像添加到资源包当中去并且更新ota_update_list.txt,根据mt_ota_preprocess.py的执行只需要修改两个文件。例如有些mtk车载平台有一个arm2分区信息,但是升级包中并没有升级该分区。假如需要添加该分区升级,则做如下修改。
(1)分区表文件修改:将OTA_Update选项改为Y

#路径:device/mediatek/build/build/tools/ptgen/xxx/partition_table_xxx_emmc.csv
Partition_Name,Type,Size_KB,,Region,Reserved,Download,Download_File,OTA_Update,EmptyBoot_Needed,FastBoot_Erase,,FastBoot_Download,,Operation_Type,RW_Attribute
-arm2,Raw data,32768,,EMMC_USER,N,Y,arm2.img,N,Y,Y,N,Y,N,AUTO,RO
+arm2,Raw data,32768,,EMMC_USER,N,Y,arm2.img,Y,Y,Y,N,Y,N,AUTO,RO

(2)挂载表文件添加arm2:

#路径:
#vendor/mediatek/proprietary/hardware/fstab/xxx/fstab.in.xxx
+FSTAB_RAW(arm2)
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值