当前位置:   article > 正文

针对amlogicAB升级-编译流程优化_make otapackage

make otapackage

一、问题描述

最近处理了一个amlogic 7.1 AB项目,升级出现system不匹配的问题,对比发现刷机包中的system与obj包中的不一致,那么就要从编译流程方面排查,将刷机和做包使用的固件进行同步

二、解决思路

说实话一开始其实没什么思路,从编译log入手也看的不是很明白,所以最好的办法就是拆分问题,1、了解make otapackage的大致流程 2、amlogic刷机包的大致生成流程,这两个方面确认好后,再回来看问题,有了些自己的想法去处理

1、make otapackage流程

总体流程其实应该是两个:

$(BUILT_TARGET_FILES_PACKAGE)      生成obj下的target文件

$(INTERNAL_OTA_PACKAGE_TARGET) 生成ota整包文件

 

otapackage 执行从build/core/Makefile 开始

  1. $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE)
  2. @echo "Package OTA: $@"
  3. $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
  4. ./build/tools/releasetools/ota_from_target_files -v \
  5. --block \
  6. $(UPDATE_DTB) \
  7. -p $(HOST_OUT) \
  8. -k $(KEY_CERT_PAIR) \
  9. $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
  10. $(BUILT_TARGET_FILES_PACKAGE) $@
  11. .PHONY: otapackage
  12. otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)

otapackage依赖 $(INTERNAL_OTA_PACKAGE_TARGET) 通过ota_from_target_files 生成ota整包

而$(INTERNAL_OTA_PACKAGE_TARGET) 仅依赖$(BUILT_TARGET_FILES_PACKAGE)

  1. $(BUILT_TARGET_FILES_PACKAGE): \
  2. $(HOST_OUT_EXECUTABLES)/bsdiff \
  3. $(INSTALLED_BOOTIMAGE_TARGET) \
  4. $(INSTALLED_RADIOIMAGE_TARGET) \
  5. $(INSTALLED_RECOVERYIMAGE_TARGET) \
  6. $(INSTALLED_SYSTEMIMAGE) \
  7. $(INSTALLED_USERDATAIMAGE_TARGET) \
  8. $(INSTALLED_CACHEIMAGE_TARGET) \
  9. $(INSTALLED_VENDORIMAGE_TARGET) \
  10. $(INSTALLED_SYSTEMOTHERIMAGE_TARGET) \
  11. $(INSTALLED_ANDROID_INFO_TXT_TARGET) \
  12. $(SELINUX_FC) \
  13. $(APKCERTS_FILE) \
  14. $(HOST_OUT_EXECUTABLES)/fs_config \
  15. | $(ACP)
  16. @echo "Package target files: $@"
  17. ......
  18. ......
  19. $(hide) (cd $(zip_root) && zip -qX ../$(notdir $@) META/*filesystem_config.txt)
  20. $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
  21. ./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完之后,如果不加任何的脚本或者其他流程,刷机包跟差分包使用固件是不一样的

 

2、amlogic刷机包的大致生成流程

  1. [ 99% 194/195] Package: out/target/product/p212/aml_upgrade_package.img
  2. cp device/amlogic/p212/upgrade/aml_sdc_burn.ini out/target/product/p212/upgrade/aml_sdc_burn.ini
  3. cp device/amlogic/p212/upgrade/u-boot.bin.sd.bin out/target/product/p212/upgrade/u-boot.bin.sd.bin
  4. cp device/amlogic/p212/upgrade/u-boot.bin.usb.bl2 out/target/product/p212/upgrade/u-boot.bin.usb.bl2
  5. cp device/amlogic/p212/upgrade/u-boot.bin.usb.tpl out/target/product/p212/upgrade/u-boot.bin.usb.tpl
  6. cp device/amlogic/p212/upgrade/platform.conf out/target/product/p212/upgrade/platform.conf
  7. cp device/amlogic/common/products/mbox/upgrade/aml_upgrade_package_AB.conf out/target/product/p212/upgrade/aml_upgrade_package_AB.conf
  8. ln -sf out/target/product/p212/boot.img out/target/product/p212/upgrade/boot.img
  9. ln -sf out/target/product/p212/u-boot.bin out/target/product/p212/upgrade/u-boot.bin
  10. ln -sf out/target/product/p212/dtb.img out/target/product/p212/upgrade/dtb.img
  11. ln -sf out/target/product/p212/system.img out/target/product/p212/upgrade/system.img
  12. ln -sf out/target/product/p212/userdata.img out/target/product/p212/upgrade/userdata.img
  13. ./vendor/amlogic/tools/aml_upgrade/aml_image_v2_packer -r out/target/product/p212/upgrade/aml_upgrade_package_AB.conf
  14. out/target/product/p212/upgrade/ out/target/product/p212/aml_upgrade_package.img
  15. [Msg]Pack Item[USB , DDR] from (out/target/product/p212/upgrade/u-boot.bin.usb.bl2),sz[0xc000]B,
  16. [Msg]Pack Item[USB , UBOOT] from (out/target/product/p212/upgrade/u-boot.bin.usb.tpl),sz[0xb4000]B,ft[normal]
  17. [Msg]Pack Item[PARTITION , _aml_dtb] from (out/target/product/p212/upgrade/dtb.img),sz[0x16000]B,ft[normal]
  18. [Msg]Pack Item[VERIFY , _aml_dtb] from (out/target/product/p212/upgrade/dtb.img),vry[sha1sum dccc4db852e30f2c3383e332e1ec1995a3a916e7]
  19. [Msg]Pack Item[UBOOT , aml_sdc_burn] from (out/target/product/p212/upgrade/u-boot.bin.sd.bin),sz[0xc0200]B,ft[normal]
  20. [Msg]Pack Item[ini , aml_sdc_burn] from (out/target/product/p212/upgrade/aml_sdc_burn.ini),sz[0x25a]B,
  21. [Msg]Pack Item[PARTITION , boot_a] from (out/target/product/p212/upgrade/boot.img),sz[0x8f4800]B,ft[normal]
  22. [Msg]Pack Item[VERIFY , boot_a] from (out/target/product/p212/upgrade/boot.img),vry[sha1sum d285ec4aab9676e8b20323c0f622e8572f98de56]
  23. [Msg]Pack Item[PARTITION , bootloader] from (out/target/product/p212/upgrade/u-boot.bin),sz[0xc0000]B,ft[normal]
  24. [Msg]Pack Item[VERIFY , bootloader] from (out/target/product/p212/upgrade/u-boot.bin),vry[sha1sum e1bc055fd718d28ca17dad577fcb148d1aef95dc]
  25. [Msg]Pack Item[PARTITION , logo] from (out/target/product/p212/upgrade/logo.img),sz[0x52a5e0]B,ft[normal]
  26. [Msg]Pack Item[VERIFY , logo] from (out/target/product/p212/upgrade/logo.img),vry[sha1sum ca14e1dab9f71ca762317ee7f4ed1fd211e1b657]
  27. [Msg]Pack Item[xml , manifest] from (out/target/product/p212/upgrade/manifest.xml),sz[0x17688]B,ft[normal]
  28. [Msg]Pack Item[dtb , meson1] from (out/target/product/p212/upgrade/dtb.img),Duplicated for _aml_dtb.PARTITION
  29. [Msg]Pack Item[conf , platform] from (out/target/product/p212/upgrade/platform.conf),sz[0xca]B,
  30. [Msg]Pack Item[PARTITION , system_a] from (out/target/product/p212/upgrade/system.img),sz[0x46d0911c]B,ft[sparse]
  31. [Msg]Pack Item[VERIFY , system_a] from (out/target/product/p212/upgrade/system.img),vry[sha1sum 023134dd6d1b72d3c0593f05ddcf7397bc2d516e]
  32. [Msg]version:0x2 crc:0x0f9baa07 size:1205436956 bytes[1149MB]
  33. Pack image[out/target/product/p212/aml_upgrade_package.img] OK
  34. 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)

  1. .PHONY:aml_upgrade
  2. aml_upgrade:$(INSTALLED_AML_UPGRADE_PACKAGE_TARGET)
  3. $(INSTALLED_AML_UPGRADE_PACKAGE_TARGET): \
  4. $(addprefix $(PRODUCT_OUT)/,$(BUILT_IMAGES)) \
  5. $(UPGRADE_FILES) \
  6. $(INSTALLED_AML_USER_IMAGES) \
  7. $(INSTALLED_AML_LOGO) \
  8. $(INSTALLED_MANIFEST_XML) \
  9. $(TARGET_USB_BURNING_V2_DEPEND_MODULES)
  10. mkdir -p $(PRODUCT_UPGRADE_OUT)
  11. $(hide) $(foreach file,$(UPGRADE_FILES), \
  12. echo cp $(file) $(PRODUCT_UPGRADE_OUT)/$(notdir $(file)); \
  13. cp -f $(file) $(PRODUCT_UPGRADE_OUT)/$(notdir $(file)); \
  14. )
  15. $(hide) $(foreach file,$(BUILT_IMAGES), \
  16. echo ln -sf $(PRODUCT_OUT)/$(file) $(PRODUCT_UPGRADE_OUT)/$(file); \
  17. ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/$(file) $(PRODUCT_UPGRADE_OUT)/$(file); \
  18. )
  19. ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true)
  20. $(hide) rm -f $(PRODUCT_UPGRADE_OUT)/u-boot.bin.encrypt.*
  21. $(hide) $(ACP) $(PRODUCT_OUT)/u-boot.bin.encrypt.* $(PRODUCT_UPGRADE_OUT)/
  22. ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/dtb.img $(PRODUCT_UPGRADE_OUT)/dtb.img
  23. ln -sf $(ANDROID_BUILD_TOP)/$(PRODUCT_OUT)/u-boot.bin.encrypt.efuse $(PRODUCT_UPGRADE_OUT)/SECURE_BOOT_SET
  24. endif# ifeq ($(PRODUCT_BUILD_SECURE_BOOT_IMAGE_DIRECTLY),true)
  25. $(security_dm_verity_conf)
  26. $(update-aml_upgrade-conf)
  27. $(hide) $(foreach userPartName, $(BOARD_USER_PARTS_NAME), \
  28. $(call aml-user-img-update-pkg,$(userPartName),$(PACKAGE_CONFIG_FILE)))
  29. @echo "Package: $@"
  30. @echo ./vendor/amlogic/tools/aml_upgrade/aml_image_v2_packer -r \
  31. $(PACKAGE_CONFIG_FILE) $(PRODUCT_UPGRADE_OUT)/ $@
  32. ./vendor/amlogic/tools/aml_upgrade/aml_image_v2_packer -r \
  33. $(PACKAGE_CONFIG_FILE) $(PRODUCT_UPGRADE_OUT)/ $@
  34. @echo " $@ installed"
  35. else
  36. #none
  37. INSTALLED_AML_UPGRADE_PACKAGE_TARGET :=
  38. endif

 

$(INSTALLED_AML_UPGRADE_PACKAGE_TARGET)还存在有别的依赖,直到最后生成aml_upgrade_package.img刷机包

 

3、定位问题

从上述两个流程可以看出,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 都是一摸一样的

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/1005006
推荐阅读
相关标签
  

闽ICP备14008679号