屏蔽android ota升级包时间戳比较

我们在recovery升级的时候,经常提示这样的错误:

Installing update...

Can't install this package (Tue Jun 27 12:29:30 CST 2017) over newer build (Mon Jun 26 17:20:32 CST 2017)

E:Error in /udisk/xxxx.zip

(Status 7)


意思就是,我们不能从新的版本升级到旧的系统,有个时间戳的比较。


我们来看看这个时间戳校验是怎么工作的:

我们发现在升级包的升级脚本中updater-script中有段校验:

[python] view plain copy
  1. (!less_than_int(1498537770, getprop("ro.build.date.utc"))) || abort("E3003: Can't install this package (Tue Jun 27 12:29:30 CST 2017) over newer build (" + getprop("ro.build.date") + ").");  

原来就是在这里进行的时间戳校验。


我们继续寻找,这个校验是在哪里加上去的呢,我们在 build/tools/releasetools/ota_from_target_files 发现了如下:

[python] view plain copy
  1. def WriteFullOTAPackage(input_zip, output_zip):  
  2.   ......  
  3.   if not OPTIONS.omit_prereq:  
  4.     ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict)  
  5.     ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict)  
  6.     script.AssertOlderBuild(ts, ts_text)  
  7.   
  8.   def option_handler(o, a):  
  9.     if  xxx:  
  10.       xxxx  
  11.     elif o in ("-n""--no_prereq"):  
  12.       OPTIONS.omit_prereq = True  
好像我们只需要告诉py,传递个参数--no_prereq,那么就不会加上时间戳的校验了


我们继续寻找,在 build/core/Makefile 中发现了对ota_from_target_files的调用:

[plain] view plain copy
  1. $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)  
  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_BASE) \  
  6.        $(UPDATE_DTB) \  
  7.        -p $(HOST_OUT) \  
  8.        -k $(KEY_CERT_PAIR) \  
  9.        $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \  
  10.        $(SECUREBOOT_MODE) \  
  11.        $(DM_VERITY) \  
  12.        $(SECURITY_DM_VERITY_MODE_WITH_TOOL) \  
  13.        $(BUILT_TARGET_FILES_PACKAGE) $@  
  14.   
  15. .PHONY: otapackage  
  16. otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)  

好了,我们在

./build/tools/releasetools/ota_from_target_files 传入参数--no_prereq即可,那么编译生成的升级包不再包含时间戳校验。

除了这个方法呢,我们提供如下方法二。


方法二:直接屏蔽比较函数,到build/tools/releasetools/ota_from_target_files这个脚本,注释掉函数 script.AssertOlderBuild(ts, ts_text)调用,这样编译生成的OTA中便不会检测时间戳了。








猜你喜欢

转载自blog.csdn.net/DKBDKBDKB/article/details/80606659