我们在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中有段校验:
- (!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 发现了如下:
- def WriteFullOTAPackage(input_zip, output_zip):
- ......
- if not OPTIONS.omit_prereq:
- ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict)
- ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict)
- script.AssertOlderBuild(ts, ts_text)
- def option_handler(o, a):
- if xxx:
- xxxx
- elif o in ("-n", "--no_prereq"):
- OPTIONS.omit_prereq = True
我们继续寻找,在 build/core/Makefile 中发现了对ota_from_target_files的调用:
- $(INTERNAL_OTA_PACKAGE_TARGET): $(BUILT_TARGET_FILES_PACKAGE) $(DISTTOOLS)
- @echo "Package OTA: $@"
- $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
- ./build/tools/releasetools/ota_from_target_files -v \
- $(BLOCK_BASE) \
- $(UPDATE_DTB) \
- -p $(HOST_OUT) \
- -k $(KEY_CERT_PAIR) \
- $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
- $(SECUREBOOT_MODE) \
- $(DM_VERITY) \
- $(SECURITY_DM_VERITY_MODE_WITH_TOOL) \
- $(BUILT_TARGET_FILES_PACKAGE) $@
- .PHONY: otapackage
- 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中便不会检测时间戳了。