我们在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.in

在Android系统的recovery升级过程中,会遇到因时间戳校验导致的升级失败问题。当尝试从一个较新的系统版本降级到较旧的版本时,会收到错误提示。错误信息表明不能从新版本升级到旧版本,原因在于存在时间戳的比较。校验逻辑存在于升级包的updater-script中,并在编译生成OTA更新包时由`build/tools/releasetools/ota_from_target_files`添加。通过在调用该工具时添加`--no_prereq`参数,可以生成不包含时间戳校验的升级包,从而绕过此限制。
最低0.47元/天 解锁文章
2234

被折叠的 条评论
为什么被折叠?



