赞
踩
最近处理了一个amlogic 7.1 AB项目,升级出现system不匹配的问题,对比发现刷机包中的system与obj包中的不一致,那么就要从编译流程方面排查,将刷机和做包使用的固件进行同步
说实话一开始其实没什么思路,从编译log入手也看的不是很明白,所以最好的办法就是拆分问题,1、了解make otapackage的大致流程 2、amlogic刷机包的大致生成流程,这两个方面确认好后,再回来看问题,有了些自己的想法去处理
总体流程其实应该是两个:
$(BUILT_TARGET_FILES_PACKAGE) 生成obj下的target文件
$(INTERNAL_OTA_PACKAGE_TARGET) 生成ota整包文件
otapackage 执行从build/core/Makefile 开始
- $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE)
- @echo "Package OTA: $@"
- $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
- ./build/tools/releasetools/ota_from_target_files -v \
- --block \
- $(UPDATE_DTB) \
- -p $(HOST_OUT) \
- -k $(KEY_CERT_PAIR) \
- $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
- $(BUILT_TARGET_FILES_PACKAGE) $@
-
- .PHONY: otapackage
- otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
otapackage依赖 $(INTERNAL_OTA_PACKAGE_TARGET) 通过ota_from_target_files 生成ota整包
而$(INTERNAL_OTA_PACKAGE_TARGET) 仅依赖$(BUILT_TARGET_FILES_PACKAGE)
$(BUILT_TARGET_FILES_PACKAGE): \ $(HOST_OUT_EXECUTABLES)/bsdiff \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(INSTALLED_RADIOIMAGE_TARGET) \ $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_SYSTEMIMAGE) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_VENDORIMAGE_TARGET) \ $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ $(SELINUX_FC) \ $(APKCERTS_FILE) \ $(HOST_OUT_EXECUTABLES)/fs_config \ | $(ACP) @echo "Package target files: $@" ...... ...... $(hide) (cd $(zip_root) && zip -qX ../$(notdir $@) META/*filesystem_config.txt) $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \ ./build/tools/releasetools/add_img_to_target_files -a -v -p $(HOST_OUT) $@
$(BUILT_TARGET_FILES_PACKAGE)需要很多依赖关系,其中$(INSTALLED_SYSTEMIMAGE) 就是重新打包system.img的,方法最后会调用add_img_to_target_files生成target文件中的IMAGES
注意:我们再次梳理下这里
$(INSTALLED_SYSTEMIMAGE)生成了out下的刷机固件
$(BUILT_TARGET_FILES_PACKAGE)文件拷贝到target后通过add脚本生成了做升级包需要的IMAGES/system.img
make otapackage完之后,如果不加任何的脚本或者其他流程,刷机包跟差分包使用固件是不一样的
[ 99% 194/195] Package: out/target/product/p212/aml_upgrade_package.img cp device/amlogic/p212/upgrade/aml_sdc_burn.ini out/target/product/p212/upgrade/aml_sdc_burn.ini cp device/amlogic/p212/upgrade/u-boot.bin.sd.bin out/target/product/p212/upgrade/u-boot.bin.sd.bin cp device/amlogic/p212/upgrade/u-boot.bin.usb.bl2 out/target/product/p212/upgrade/u-boot.bin.usb.bl2 cp device/amlogic/p212/upgrade/u-boot.bin.usb.tpl out/target/product/p212/upgrade/u-boot.bin.usb.tpl cp device/amlogic/p212/upgrade/platform.conf out/target/product/p212/upgrade/platform.conf cp device/amlogic/common/products/mbox/upgrade/aml_upgrade_package_AB.conf out/target/product/p212/upgrade/aml_upgrade_package_AB.conf ln -sf out/target/product/p212/boot.img out/target/product/p212/upgrade/boot.img ln -sf out/target/product/p212/u-boot.bin out/target/product/p212/upgrade/u-boot.bin ln -sf out/target/product/p212/dtb.img out/target/product/p212/upgrade/dtb.img ln -sf out/target/product/p212/system.img out/target/product/p212/upgrade/system.img ln -sf out/target/product/p212/userdata.img out/target/product/p212/upgrade/userdata.img ./vendor/amlogic/tools/aml_upgrade/aml_image_v2_packer -r out/target/product/p212/upgrade/aml_upgrade_package_AB.conf out/target/product/p212/upgrade/ out/target/product/p212/aml_upgrade_package.img [Msg]Pack Item[USB , DDR] from (out/target/product/p212/upgrade/u-boot.bin.usb.bl2),sz[0xc000]B, [Msg]Pack Item[USB , UBOOT] from (out/target/product/p212/upgrade/u-boot.bin.usb.tpl),sz[0xb4000]B,ft[normal] [Msg]Pack Item[PARTITION , _aml_dtb] from (out/target/product/p212/upgrade/dtb.img),sz[0x16000]B,ft[normal] [Msg]Pack Item[VERIFY , _aml_dtb] from (out/target/product/p212/upgrade/dtb.img),vry[sha1sum dccc4db852e30f2c3383e332e1ec1995a3a916e7] [Msg]Pack Item[UBOOT , aml_sdc_burn] from (out/target/product/p212/upgrade/u-boot.bin.sd.bin),sz[0xc0200]B,ft[normal] [Msg]Pack Item[ini , aml_sdc_burn] from (out/target/product/p212/upgrade/aml_sdc_burn.ini),sz[0x25a]B, [Msg]Pack Item[PARTITION , boot_a] from (out/target/product/p212/upgrade/boot.img),sz[0x8f4800]B,ft[normal] [Msg]Pack Item[VERIFY , boot_a] from (out/target/product/p212/upgrade/boot.img),vry[sha1sum d285ec4aab9676e8b20323c0f622e8572f98de56] [Msg]Pack Item[PARTITION , bootloader] from (out/target/product/p212/upgrade/u-boot.bin),sz[0xc0000]B,ft[normal] [Msg]Pack Item[VERIFY , bootloader] from (out/target/product/p212/upgrade/u-boot.bin),vry[sha1sum e1bc055fd718d28ca17dad577fcb148d1aef95dc] [Msg]Pack Item[PARTITION , logo] from (out/target/product/p212/upgrade/logo.img),sz[0x52a5e0]B,ft[normal] [Msg]Pack Item[VERIFY , logo] from (out/target/product/p212/upgrade/logo.img),vry[sha1sum ca14e1dab9f71ca762317ee7f4ed1fd211e1b657] [Msg]Pack Item[xml , manifest] from (out/target/product/p212/upgrade/manifest.xml),sz[0x17688]B,ft[normal] [Msg]Pack Item[dtb , meson1] from (out/target/product/p212/upgrade/dtb.img),Duplicated for _aml_dtb.PARTITION [Msg]Pack Item[conf , platform] from (out/target/product/p212/upgrade/platform.conf),sz[0xca]B, [Msg]Pack Item[PARTITION , system_a] from (out/target/product/p212/upgrade/system.img),sz[0x46d0911c]B,ft[sparse] [Msg]Pack Item[VERIFY , system_a] from (out/target/product/p212/upgrade/system.img),vry[sha1sum 023134dd6d1b72d3c0593f05ddcf7397bc2d516e] [Msg]version:0x2 crc:0x0f9baa07 size:1205436956 bytes[1149MB] Pack image[out/target/product/p212/aml_upgrade_package.img] OK out/target/product/p212/aml_upgrade_package.img installed
以上是编译部分的log,可以看出生成aml_upgrade_package.img的大致流程
1、创建upgrade目录
2、将需要刷机的img文件拷贝入upgrade
3、执行脚本进行pack
这个工作所有的代码都由一个文件完成./device-amlogic/common/factory.mk,那么问题来了,怎么跑起来这个mk文件的
在devce 和 build 下 grep之后发现 只有这么一句
device-amlogic/p212/AndroidBoard.mk:20:include device/amlogic/common/factory.mk
这里运行机制也是从otapackage 开始,可以看出有两个依赖
droidcore: $(INSTALLED_AML_UPGRADE_PACKAGE_TARGET) $(INSTALLED_MANIFEST_XML)
otapackage: $(INSTALLED_AML_UPGRADE_PACKAGE_TARGET) $(INSTALLED_MANIFEST_XML)
.PHONY:aml_upgrade aml_upgrade:$(INSTALLED_AML_UPGRADE_PACKAGE_TARGET) $(INSTALLED_AML_UPGRADE_PACKAGE_TARGET): \ $(addprefix $(PRODUCT_OUT)/,$(BUILT_IMAGES)) \ $(UPGRADE_FILES) \ $(INSTALLED_AML_USER_IMAGES) \ $(INSTALLED_AML_LOGO) \ $(INSTALLED_MANIFEST_XML) \ $(TARGET_USB_BURNING_V2_DEPEND_MODULES) mkdir -p $(PRODUCT_UPGRADE_OUT) $(hide) $(foreach file,$(UPGRADE_FILES), \ echo cp $(file) $(PRODUCT_UPGRADE_OUT)/$(notdir $(file)); \ cp -f $(file) $(PRODUCT_UPGRADE_OUT)/$(notdir $(file)); \ ) $(hide) $(foreach file,$(BUILT_IMAGES), \ echo ln -sf $(PRODUCT_OUT)/$(file) $(PRODUCT_UPGRADE_OUT)/$(file); \ ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/$(file) $(PRODUCT_UPGRADE_OUT)/$(file); \ ) ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true) $(hide) rm -f $(PRODUCT_UPGRADE_OUT)/u-boot.bin.encrypt.* $(hide) $(ACP) $(PRODUCT_OUT)/u-boot.bin.encrypt.* $(PRODUCT_UPGRADE_OUT)/ ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/dtb.img $(PRODUCT_UPGRADE_OUT)/dtb.img ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/u-boot.bin.encrypt.efuse $(PRODUCT_UPGRADE_OUT)/SECURE_BOOT_SET endif# ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true) $(security_dm_verity_conf) $(update-aml_upgrade-conf) $(hide) $(foreach userPartName, $(BOARD_USER_PARTS_NAME), \ $(call aml-user-img-update-pkg,$(userPartName),$(PACKAGE_CONFIG_FILE))) @echo "Package: $@" @echo ./vendor/amlogic/tools/aml_upgrade/aml_image_v2_packer -r \ $(PACKAGE_CONFIG_FILE) $(PRODUCT_UPGRADE_OUT)/ $@ ./vendor/amlogic/tools/aml_upgrade/aml_image_v2_packer -r \ $(PACKAGE_CONFIG_FILE) $(PRODUCT_UPGRADE_OUT)/ $@ @echo " $@ installed" else #none INSTALLED_AML_UPGRADE_PACKAGE_TARGET := endif
$(INSTALLED_AML_UPGRADE_PACKAGE_TARGET)还存在有别的依赖,直到最后生成aml_upgrade_package.img刷机包
从上述两个流程可以看出,amlogic把这两个流程合并为了 同一个命令 make otapackage 中执行,但是从完整的编译log可以看出目前的流程大致分为了:
1、编译kernel
2、编译system
3、打包刷机镜像
4、执行obj包的生成
这样编译倒是省条命令,但是刷机的跟做包的不一致,尝试调整了几次执行的顺序,先执行完make otapakcage 在进行打包,但是因为都是由otapackage目标发起,没找到具体可以更改顺序的方法
既然不好换,换一种思路,把两个流程分开执行,既然factory.mk 里面是以otapackage 为目标的,那么可以换成别的么,实际测试发现可以
更换为
pack: $(INSTALLED_AML_UPGRADE_PACKAGE_TARGET) $(INSTALLED_MANIFEST_XML)
执行make pack -j 可以编出刷机包
但是编译的时候会从新对system.img进行打包,这个就不是我们需要的了,对于我这种修改问题的方法,卡在解决的关键就是怎么去除pack时候的system打包
对这个mk文件不是很了解,去除system打包这一步折腾了比较长的时间,从$(INSTALLED_AML_UPGRADE_PACKAGE_TARGET)依赖关系入手,最后找到了$(BUILT_IMAGES)相关
ifeq ($(AB_OTA_UPDATER),true)
BUILT_IMAGES += system.img userdata.img
else
BUILT_IMAGES += system.img userdata.img cache.img
endif
更改为BUILT_IMAGES += userdata.img 发现不再单独生成system.img 变成了简单的拷贝和打包的动作了
那么到这里也就更改完成
1、make otapackage 通过自己的拷贝脚本 把中间包里的system拷贝到out下
2、make pack 通过脚本对out下的固件进行打包,这样upgrade out obj 理论上 system 都是一摸一样的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。