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)