Android A/B System OTA 升级以及报错处理

介绍

    A/B System OTA是Android 7.0引入的新的OTA方式,跟以前的OTA在升级流程上来说已经完全不一样了,我们都知道之前的OTA走的是recovery模式。A/B System 不同之处在于系统中有两个system分区,当然boot分区也是两个,A和B,当我们进行OTA升级的时候实际上只是对b分区进行升级,而我们正在运行的a分区是不受影响的。

 

OTA包制作

    制作流程跟以前是一样的,我简单提一下,首先就是make命令:

make otapackage

生成的target_files文件在out目录下:

out/target/product/xxx/obj/PACKAGING/target_files_intermediates/xxx.zip

OTA完整包在out下面,与system.img同一级目录,这里就不多说了。差分包的制作:

./build/tools/releasetools/ota_from_target_files -v --block -p out/host/linux-x86 -k build/target/product/security/testkey -i target_files_01.zip target_files_02.zip update.zip

生成的update.zip就是我们所需要的差分包。

 

OTA升级流程

    根据官方文档的说明,主要分为以下几步:

1、将上面生成的OTA包push到机器中,

adb push update.zip /data/ota_package/update.zip

2、解析OTA包,生成升级所需参数

ota.py update.zip

附上Python脚本

import sys
import zipfile
def main():
    if len(sys.argv) != 2:
        sys.stderr.write('Use: %s <ota_file.zip>\n' % sys.arv[0])
        return 1
    otazip = zipfile.ZipFile(sys.argv[1], 'r')
    payload_info = otazip.getinfo('payload.bin')
    payload_offset = payload_info.header_offset +len(payload_info.FileHeader())
    payload_size = payload_info.file_size
    payload_location = '/data/ota_package/update.zip'
    headers = otazip.read('payload_properties.txt')
    print (
        'update_engine_client --update --follow --payload=file://{payload_location}'
        ' --offset={payload_offset} --size={payload_size}'
        ' --headers="{headers}"').format(**locals())
    return 0
if __name__ == '__main__':
    sys.exit(main())

3、执行上面Python脚本解析之后的命令,shell环境中执行:

update_engine_client --update --follow
--payload=/data/ota_package/update.zip --offset=PAYLOAD_OFFSET
--size=PAYLOAD_SIZE --headers="HEADERS"

4、重启机器

 

升级过程中的报错及解决方案

    先贴上log


I update_engine: [0530/162336:INFO:delta_performer.cc(359)] Applying 21701 operations to partition "system"
E update_engine: [0530/162336:ERROR:delta_performer.cc(1060)] The hash of the source data on disk for this operation doesn't match the expected value. This could mean that the delta update payload was targeted for another version, or that the source partition was modified after it was installed, for example, by mounting a filesystem.
E update_engine: [0530/162336:ERROR:delta_performer.cc(1065)] Expected:   sha256|hex = 839ACF5296B9AB820DC822B6C09EBA896905531EB2C581093A357411F1A444A0
E update_engine: [0530/162336:ERROR:delta_performer.cc(1068)] Calculated: sha256|hex = 18AF8D6842A71554893F1DE65B87F2A9639FB390357C71D5383C6ED7A6051AFA
E update_engine: [0530/162336:ERROR:delta_performer.cc(1077)] Operation source (offset:size) in blocks: 0:2,193:1,218:456,23471:8,32769:1,32961:1,37333:4,37351:3,37554:3,37570:2,37951:1,37959:1,38111:1,38125:1,38129:1,38139:1,38147:1,38149:1,38151:2,38155:1,38157:1,38360:5,38372:1,38377:5,38384:1,38437:1,38442:1,38447:1,38452:1,38457:1,38462:1,38467:1
E update_engine: [0530/162336:ERROR:delta_performer.cc(1260)] ValidateSourceHash(source_hasher.raw_hash(), operation, error) failed.
E update_engine: [0530/162336:ERROR:delta_performer.cc(283)] Failed to perform SOURCE_BSDIFF operation 8, which is the operation 0 in partition "system"
E update_engine: [0530/162336:ERROR:download_action.cc(273)] Error 20 in DeltaPerformer's Write method when processing the received payload -- Terminating processing
I update_engine: [0530/162336:INFO:delta_performer.cc(299)] Discarding 113721 unused downloaded bytes
I update_engine: [0530/162336:INFO:multi_range_http_fetcher.cc(171)] Received transfer terminated.
I update_engine: [0530/162336:INFO:multi_range_http_fetcher.cc(123)] TransferEnded w/ code 200
I update_engine: [0530/162336:INFO:multi_range_http_fetcher.cc(125)] Terminating.
I update_engine: [0530/162336:INFO:action_processor.cc(116)] ActionProcessor: finished DownloadAction with code ErrorCode::kDownloadStateInitializationError
I update_engine: [0530/162336:INFO:action_processor.cc(121)] ActionProcessor: Aborting processing due to failure.
I update_engine: [0530/162336:INFO:update_attempter_android.cc(286)] Processing Done.
I update_engine: [0530/162336:INFO:update_attempter_android.cc(306)] Resetting update progress.

从log可以看出,是校验system的时候两次hash值不匹配导致的,造成这个错误的原因是我直接刷的out下面的system.img,而这个system.img与target_files中的system.img时间戳不同,导致校验失败。

解决方案就是用target_files中的system.img代替out下面的。

 

中间还有一个小插曲,adb remount也会导致同样的错误,可能是重新挂载分区会影响到校验结果,这个还在研究中。

<think>好的,我现在需要解决用户提到的Android 13 OTA升级时出现preloader_b报错的问题。首先,我得理解这个问题的背景。用户可能在进行OTA升级时遇到了与preloader_b相关的错误,但具体的错误信息可能没有详细给出,所以我需要根据已有的引用资料和常见问题来推测可能的原因和解决方案。 首先,参考用户提供的引用内容,特别是引用[1]和引用[2],这两个都是关于OTA升级失败的不同错误。引用[1]提到的是路径问题,而引用[2]则是关于系统分区被重新挂载为读写导致OTA失败。preloader通常与设备的引导加载程序(bootloader)相关,可能涉及分区表或固件更新。 接下来,我需要考虑可能的几个方向: 1. **分区问题**:preloader可能涉及A/B分区的更新机制。Android使用A/B分区来实现无缝更新,可能在切换分区时出现问题。如果preloader_b分区损坏或无法访问,可能导致升级失败。 2. **固件版本不匹配**:OTA包可能要求设备当前的preloader版本与升级包中的版本兼容。如果设备当前的preloader版本过旧或与新版本不兼容,可能会报错。 3. **签名验证失败**:preloader分区可能包含引导加载程序,其签名可能与OTA包中的不匹配,导致验证失败。 4. **硬件兼容性问题**:某些设备的preloader可能与特定的硬件版本相关,OTA包可能没有正确适配所有硬件变种。 根据引用[3]提到的NVRAM配置在OTA升级或恢复出厂设置时不会被清除,可能需要检查NVRAM中的相关配置是否正确,或者是否存在冲突的设置导致preloader更新失败。 接下来,可能的解决方案步骤包括: - **检查分区状态**:使用fastboot命令或恢复模式下的工具检查preloader_b分区的完整性和状态。例如,使用`fastboot getvar all`查看分区信息。 - **验证OTA包完整性**:确保下载OTA包完整且未损坏,重新下载或验证签名。 - **清除缓存分区**:有时缓存分区中的旧数据可能导致升级问题,尝试在恢复模式下清除缓存。 - **检查系统分区挂载状态**:根据引用[2],如果系统分区被挂载为读写,可能导致OTA失败。需要确保在升级前系统分区处于正确的只读状态。 - **更新Bootloader/Preloader**:如果可能,尝试单独更新preloader分区,可能需要使用特定的工具或固件包。 - **联系设备制造商**:如果问题持续,可能存在硬件或特定于设备的问题,需要厂商提供支持或特定补丁。 需要确保用户在进行这些操作时不会进一步损坏设备,尤其是在刷写分区时需格外小心。同时,建议用户备份重要数据,避免数据丢失。 此外,用户的问题可能与OTA升级流程中的preloader更新步骤有关,可能需要查看具体的日志文件(如last_log)来确定具体错误原因。例如,是否有权限问题、空间不足或签名验证失败等详细信息。 最后,综合以上思路,整理出结构化的解决方案,分步骤指导用户排查和解决问题,并生成相关问题供进一步参考。</think>### Android 13 OTA升级preloader_b报错解决方案 #### 1. 检查分区状态与OTA包完整性 - **验证分区表**:通过Fastboot命令检查`preloader_b`分区的状态,确保其未被损坏或意外修改。例如使用: ```bash fastboot getvar all ``` 查看分区信息是否正常。若发现分区异常,可能需要通过工厂镜像修复[^1]。 - **确认OTA包签名与版本**:确保下载OTA包与设备型号、当前系统版本完全匹配,并通过MD5/SHA校验文件完整性[^3]。 #### 2. 处理系统分区挂载问题 - **确保系统分区为只读**:在OTA升级前,若系统分区被挂载为读写模式(例如因第三方Recovery或Root工具修改),会导致升级失败。需通过以下步骤恢复: 1. 进入Recovery模式,执行: ```bash adb shell mount -o remount,ro /system ``` 2. 清除缓存分区后再尝试升级[^2]。 #### 3. 更新Preloader/Bootloader - **手动刷写Preloader分区**:若确认`preloader_b`损坏,需使用厂商提供的专用工具(如SP Flash Tool)重新刷写预加载分区。**注意:此操作风险较高,需严格遵循厂商指南。** #### 4. 检查NVRAM配置 - **重置NVRAM参数**:部分设备的NVRAM配置可能干扰OTA流程。尝试在Fastboot模式下执行: ```bash fastboot erase nvram ``` **注意:此操作会清除基带校准等数据,可能导致信号问题,建议联系售后操作[^3]。** #### 5. 获取详细日志分析 - **提取升级日志**:在Recovery模式下通过`adb pull /tmp/recovery.log`获取日志,搜索`preloader_b`相关错误关键词(如`failed to update preloader_b`或`signature mismatch`),进一步定位具体原因。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值