笔友城堡 - 可定义的个人主页

前言

最近解除AndroidOTA升级,下面简单记录一下Android OTA 升级错误代码。

记录于此,方便自己查阅。

正文

时间戳与版本校验

错误码参数名称含义解释产生原因分析
51kPayloadTimestampError载荷时间戳错误OTA 包的时间戳早于或等于设备当前系统的时间戳。1. 防回滚机制:Android 禁止刷入旧版本,如果 OTA 包的构建时间比手机当前的系统时间早,就会报错。2. 编译环境问题:服务器编译时间设置错误,或者手动修改了系统时间导致时间倒流。3. 重复刷写:尝试刷入一个完全相同版本的包,且该包没有更新内部时间戳。
44kUnsupportedMajorPayloadVersion不支持的主版本号OTA 包的主版本号过高,当前的 update_engine 无法解析。通常发生在用旧版系统去刷新版系统的包时。
45kUnsupportedMinorPayloadVersion不支持的次版本号同上,次版本号不兼容。
56kVerifyCalculationError验证计算错误。在验证 Payload(载荷)签名或哈希值时,计算结果不匹配。可能是文件损坏或密钥不匹配。

Omaha 协议交互类错误 (网络/服务器)

Omaha 是 Google 定义的自动更新协议。这类错误表示设备在与更新服务器“沟通”时出了问题。

错误码参数名称含义解释产生原因分析
30kOmahaRequestEmptyResponseError请求响应为空。服务器返回了空数据,可能是服务器宕机、网络拦截或 URL 配置错误。
31kOmahaRequestXMLParseErrorXML 解析错误。服务器返回的数据格式不是合法的 XML,或者包含乱码,导致客户端无法解析。
35kOmahaResponseInvalid响应无效。服务器返回了数据,但内容不符合 Omaha 协议的规范(例如缺少必要的字段)。
37kOmahaErrorInHTTPResponseHTTP 响应错误。网络层面的错误,如 404 (找不到资源)、500 (服务器内部错误) 或 403 (无权限)。
46kOmahaRequestXMLHasEntityDeclXML 包含实体声明。这是一个安全校验错误。为了防止 XXE 攻击,解析器拒绝处理包含 <!ENTITY> 声明的 XML 数据。
55kFirstActiveOmahaPingSentPersistenceError首次激活 Ping 发送持久化错误。系统在记录“已发送首次激活信号”这一状态到磁盘时失败(通常是文件系统只读或空间不足)。

下载与元数据类错误

这类错误发生在从服务器下载 OTA 包,或者读取 OTA 包头部信息(Metadata)的阶段。

错误码参数名称含义解释产生原因分析
32kDownloadInvalidMetadataSize元数据大小无效。下载的 Metadata 文件大小为 0 或超出合理范围,说明下载不完整或服务器文件损坏。
33kDownloadInvalidMetadataSignature元数据签名无效。严重安全问题。下载下来的 Metadata 文件的数字签名验证失败,说明文件可能被篡改或使用了错误的私钥签名。
38kDownloadOperationHashMissingError操作哈希缺失。Payload 中定义的某个具体操作步骤(Operation)缺少预期的 Hash 值,导致无法校验完整性。
39kDownloadMetadataSignatureMissingError元数据签名缺失。OTA 包中根本没有包含签名信息,这通常意味着打包脚本出错。
47kFilesystemVerifierError文件系统验证错误。在写入分区前,对目标分区的文件系统进行检查时发现异常。
62kPackageExcludedFromUpdate包被排除在更新之外。服务器策略告诉设备:“虽然有新包,但你的设备不在允许更新的白名单内”,因此主动放弃更新。

安装执行与系统状态类错误

这类错误发生在真正开始写入 Flash 存储、切换分区或重启的过程中。

错误码参数名称含义解释产生原因分析
41kPostinstallPowerwashError安装后清除数据(Powerwash)错误。升级完成后需要清除用户数据(恢复出厂设置)时失败了。通常是因为 /data 分区挂载问题或加密问题。
42kUpdateCanceledByChannelChange因通道变更取消更新。用户在更新过程中切换了更新通道(例如从 Stable 切到了 Beta),系统为了安全会立即终止当前更新。
43kPostinstallFirmwareRONotUpdatable固件只读不可更新。尝试更新某些只读(RO)的固件分区失败。
48kUserCanceled用户取消。用户在设置界面手动点击了“暂停”或“取消”按钮。
50kOmahaUpdateIgnoredOverCellular蜂窝网络下忽略更新。策略限制:系统检测到当前使用的是移动数据(4G/5G),且更新包过大或被配置为仅允许 Wi-Fi 更新。
52kUpdatedButNotActive已更新但未激活。新系统已经写入到了备用分区(Slot B),但是未能成功将其标记为“启动分区”(Active)。重启后还是会进旧系统。
53kNoUpdate无更新。这不是错误,而是正常状态。表示当前系统已经是最新版本,无需操作。
54kRollbackNotPossible无法回滚。尝试降级失败。通常是因为防回滚计数器(Anti-rollback index)已经增加,硬件熔断机制阻止了刷入旧版本。
60kNotEnoughSpace空间不足。设备的 /data 分区或缓存分区剩余空间不足以存放下载的安装包或进行解压操作。
61kDeviceCorrupted设备损坏。检测到关键系统分区(如 Boot, System)的文件系统损坏,为了保护设备,停止更新。
63kPostinstallMountError安装后挂载错误。更新写入完成后,尝试挂载新分区进行后续脚本执行时失败。

其他底层错误

错误码参数名称含义解释
36kOmahaUpdateDeferredForBackoff更新被推迟(退避算法)。
49kNonCriticalUpdateInOOBEOOBE 期间的非关键更新。
57kInternalLibCurlErrorLibCurl 内部错误。
58kUnresolvedHostError主机名无法解析。
59kUnresolvedHostRecovered主机名解析恢复。

快速排查

  • 错误 51 (kPayloadTimestampError):设备当前分区时间戳 > Payload 中 max_timestamp,通常是刷了较新 vendor 后试图刷旧版本 OTA,或 SPL 日期倒退。检查 build.propro.build.date.utc 与 Payload manifest。
  • 错误 32 (kDownloadInvalidMetadataSize):调用 applyPayload 时传的 METADATA_SIZE 与包内实际大小不一致,常见于 offset/size 填错
  • 错误 47 (kFilesystemVerifierError):post-install 校验新系统分区 hash 失败,多见于损坏的 OTA 包或闪存坏块。
  • 错误 60 (kNotEnoughSpace):A/B 设备虽有两个 Slot,但仍需临时空间解压,建议保留 ≥ 预留大小 + payload 解压空间。

总结

遇到 OTA 失败时:

  1. 首先看 Logcat:搜索 update_engine 关键字。
  2. 定位 Error Code:找到类似 ErrorCode: 51 的数字。
  3. 查阅此表:根据数字找到对应的含义
    • 如果是 51,检查编译时间和手机系统时间
    • 如果是 30/37,检查网络连通性和服务器状态
    • 如果是 60,清理手机存储空间

参考文章

AI(腾讯元宝、阿里云千问

相关文章

笔友城堡 - 可定义的个人主页

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

none
暂无评论...