OTA之高版本降级到低版本注意事项
(2018-11-08 14:16:05)
标签:
教育 |
分类: SCM |
我们在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)
意思就是,我们不能从新的版本升级到旧的系统,有个时间戳的比较。
方法一:
Android的OTA升级包中,里面有一个升级脚本,该脚本会检测recovey镜像的编译时间和OTA包的编译时间,如果recovey比OTA包的时间要新的话,升级便会失败。如果是这样的话,就得重新编译OTA包了。
为了提供开发速度,可找到build/tools/releasetools/ota_from_target_files这个脚本,屏蔽一下这个函数 script.AssertOlderBuild(ts, ts_text),
这样编译生成的OTA中便不会检测时间戳了。
为了提供开发速度,可找到build/tools/releasetools/ota_from_target_files这个脚本,屏蔽一下这个函数 script.AssertOlderBuild(ts, ts_text),
这样编译生成的OTA中便不会检测时间戳了。
方法二:
我们来看看这个时间戳校验是怎么工作的:
我们发现在升级包的升级脚本中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) \
.PHONY: otapackage
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)
好了,我们在
./build/tools/releasetools/ota_from_target_files
传入参数--no_prereq即可,那么编译生成的升级包不再包含时间戳校验。
OPTIONS.omit_prereq = False
把这个宏控改成true即可。
前一篇:EventBus使用
后一篇:adb命令模拟按键事件