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相关的操作都会去掉
第二种情况,整包升级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方法出现问题
第四步,引入第二个猜想
既然我们使用了整包中的方法不能实现,那么如果我们直接用FOTA包编译整包呢,发现跟差分报相同的错误,
查看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文件, 并且验证成功
3、问题探讨
这个问题有个疑问点,整包是缺库了,但是本身我们FOTA包中的库是如何打包进去的呢 这时候还是联想到了makefile 因为整包的命令中有 -P HOST_OUT 所以猜测这部分在makefile中是有定义的,查找后找到了这部分文件