recovery 升级时间戳校验

来源:互联网 发布:淘宝网最新版本 编辑:程序博客网 时间:2024/06/07 22:48

我们在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
好像我们只需要告诉py,传递个参数--no_prereq,那么就不会加上时间戳的校验了


我们继续寻找,在 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: otapackageotapackage: $(INTERNAL_OTA_PACKAGE_TARGET)

好了,我们在

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