recovery 升级时间戳校验

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

我们在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
<think>嗯,用户想了解OTA反向升级的实现方式以及设备恢复。首先,我需要明确什么是OTA反向升级。通常OTA升级是指从低版本升级到高版本,而反向升级应该是指降级,也就是回退到旧版本系统。这可能涉及到系统分区的回滚操作。 然后,设备恢复可能指的是当升级出现问题后,如何通过recovery模式来恢复设备。根据用户提供的引用[1],recovery模式会在bootloader阶段解析BCB数据启动,进入recovery应用。这说明recovery在系统恢复中起关键作用。 接下来,用户提到的引用[2]显示在生成OTA包时,可能注释掉了版本检查的代码。这可能是为了绕过版本验证,允许安装旧版本的OTA包,从而实现反向升级。不过,这样做可能有风险,比如数据兼容性问题或签名验证失败。 我需要确认OTA反向升级的实现方式通常有哪些。首先,系统可能需要解除版本检查,允许降级。其次,可能需要处理数据分区的兼容性,例如清除数据或保留用户数据。此外,签名验证也是一个问题,旧版本的OTA包可能需要使用相同的签名密钥才能通过验证。 关于设备恢复,进入recovery模式后,用户可以选择安装OTA包,包括旧版本的包,前提是签名正确且版本检查被绕过。但强制降级可能会导致数据丢失,需要用户备份。 可能的问题包括:如何修改OTA生成脚本以允许降级,如何处理数据分区,签名验证的机制,以及如何在recovery中执行降级操作。此外,还要考虑安全风险,比如降级可能引入已知漏洞。 需要确保回答涵盖这些点,并引用用户提供的资料。例如,修改ota_from_target_files.py中的版本检查,如引用[2]所示,注释掉AssertOlderBuild,这样生成的OTA包可以安装旧版本。同时,引用[1]提到recovery模式负责处理安装,所以设备进入recovery后执行降级操作。 最后,用户可能需要步骤指导,比如修改脚本、生成降级包、进入recovery安装等,并提醒注意事项如数据备份和签名问题。</think>### OTA反向升级的实现与设备恢复机制 #### 一、OTA反向升级的定义与限制 反向升级(降级)指将设备系统版本从高版本回退到低版本。该操作受以下限制: 1. **版本校验机制**:标准OTA升级包含版本时间戳检查(如示例代码中的`AssertOlderBuild`)[^2] 2. **签名验证**:低版本固件需与设备原有签名密钥匹配 3. **分区兼容性**:系统分区结构在版本迭代中可能发生变化 #### 二、反向升级实现方式 1. **修改OTA生成脚本** 注释版本检查代码以绕过限制(如示例中Python脚本的修改): ```python # 原始代码 script.AssertOlderBuild(ts, ts_text) # 修改后代码 # script.AssertOlderBuild(ts, ts_text) [^2] ``` 2. **Recovery模式手动安装** 通过以下路径强制刷写旧版本包: ``` bootloader → recovery模式 → 选择降级包安装[^1] ``` 3. **专用降级通道** 厂商可能提供特殊签名包或fastboot命令: ```bash fastboot flash system old_image.img ``` #### 三、设备恢复关键机制 1. **BCB(Bootloader Control Block)** 存储恢复操作指令,设备重启时由bootloader解析[^1] 2. **双系统分区(A/B)** 现代设备采用交替分区设计保证回滚能力 3. **用户数据处理** | 方式 | 实现方法 | 风险等级 | |-------------|---------------------------|----------| | 保留数据 | 跳过userdata分区格式化 | 高 | | 清除数据 | 在OTA包中包含格式化指令 | 低 | | 混合模式 | 降级后触发兼容性检查 | 中 | #### 四、实现步骤示例 1. 生成降级包: ```bash ./build/tools/releasetools/ota_from_target_files -n \ target-files.zip ota_package.zip ``` 2. 进入Recovery: ```bash adb reboot recovery ``` 3. 签名验证绕过: ```python # 在设备端修改update_engine配置 update_engine_client --update --follow --payload=file:///sdcard/ota_package.zip ``` #### 五、风险控制建议 1. 强制降级前执行`adb backup`备份用户数据 2. 验证bootloader解锁状态 3. 确保降级包与当前硬件版本匹配
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值