1、涉及文件

2、流程解析

3、问题探讨

 

1、涉及文件

./build/make/core/Makefile  

ota脚本 ./build/toos/releasetools/  

9.0FOTA包  

9.0源码

2、流程解析

本次问题是一家方案公司的编译环境有问题,经常出现升级报错vendor不匹配的问题,大致看了下升级脚本 修改为整包升级或者不升级两种情况,

首先我们要明白,最开始只有system分区查分,后续出现了vnedor,oem等等,所以原生的脚本里其他分区全部 都是仿照system加进去的,

以下是差分的主入口,调用commpy的blockDifference处理,这里的vendor_diff是关键参数,后续所有的判断 都以该参数为准

所以第一种不升级vendor的情况就是直接修改venor_diff = None,这样所有vendor相关的操作都会去掉

Android 的param分区 android vendor分区_Android vendor分区

第二种情况,整包升级vendor

第一步,对于这个问题,并没有直接想按流程研究代码的意思,而是想更为简单的直接照搬T卡包里的vendor升级的方法    

vendor_tgt = GetImage("vendor", OPTIONS.input_tmp)    

vendor_tgt.ResetFileMap()    

vendor_diff = common.BlockDifference("vendor", vendor_tgt)    

vendor_diff.WriteScript(script, output_zip)

报了一堆错误,可以看出是调用的BlockDifference方法出现问题

Android 的param分区 android vendor分区_Android vendor分区_02

Android 的param分区 android vendor分区_编译环境_03

第四步,引入第二个猜想

既然我们使用了整包中的方法不能实现,那么如果我们直接用FOTA包编译整包呢,发现跟差分报相同的错误,

Android 的param分区 android vendor分区_Android vendor分区_04

查看makefile中make otapackage过程中编译full包的方法       

./build/tools/releasetools/ota_from_target_files -v \      

  --block \       

--extracted_input_target_files $(patsubst %.zip,%,$(BUILT_TARGET_FILES_PACKAGE)) \       

-p $(HOST_OUT) \     

   -k $(KEY_CERT_PAIR) \     

   -s $(OTA_TOOL_EXTENSION)/mt_ota_from_target_files \

基本上是相同的命令,于是把我们的包放在源码中测试,发现可以做成功,

那基本上问题就可以确认了,问题 来源于 -P host_out,可以确定因为打包的库不全,所以出现了整包编译不出来的情况,包括整个升级vendor 的方法也无法运行

第五步,这里一开始并不知道是缺的那个库,所以挨个对比排查,最后查出了所缺的bin文件和lib64文件, 并且验证成功

Android 的param分区 android vendor分区_差分_05

3、问题探讨

这个问题有个疑问点,整包是缺库了,但是本身我们FOTA包中的库是如何打包进去的呢 这时候还是联想到了makefile  因为整包的命令中有 -P HOST_OUT 所以猜测这部分在makefile中是有定义的,查找后找到了这部分文件

Android 的param分区 android vendor分区_Android 的param分区_06

Android 的param分区 android vendor分区_差分_07