加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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中便不会检测时间戳了。

方法二:

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

我们发现在升级包的升级脚本中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: otapackage
otapackage: $(INTERNAL_OTA_PACKAGE_TARGET)

好了,我们在
./build/tools/releasetools/ota_from_target_files 传入参数--no_prereq即可,那么编译生成的升级包不再包含时间戳校验。
OPTIONS.omit_prereq = False  把这个宏控改成true即可。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有