前言
最近解除AndroidOTA升级,下面简单记录一下Android OTA 升级错误代码。
记录于此,方便自己查阅。
正文
时间戳与版本校验
| 错误码 | 参数名称 | 含义解释 | 产生原因分析 |
|---|---|---|---|
| 51 | kPayloadTimestampError | 载荷时间戳错误OTA 包的时间戳早于或等于设备当前系统的时间戳。 | 1. 防回滚机制:Android 禁止刷入旧版本,如果 OTA 包的构建时间比手机当前的系统时间早,就会报错。2. 编译环境问题:服务器编译时间设置错误,或者手动修改了系统时间导致时间倒流。3. 重复刷写:尝试刷入一个完全相同版本的包,且该包没有更新内部时间戳。 |
| 44 | kUnsupportedMajorPayloadVersion | 不支持的主版本号 | OTA 包的主版本号过高,当前的 update_engine 无法解析。通常发生在用旧版系统去刷新版系统的包时。 |
| 45 | kUnsupportedMinorPayloadVersion | 不支持的次版本号 | 同上,次版本号不兼容。 |
| 56 | kVerifyCalculationError | 验证计算错误。 | 在验证 Payload(载荷)签名或哈希值时,计算结果不匹配。可能是文件损坏或密钥不匹配。 |
Omaha 协议交互类错误 (网络/服务器)
Omaha 是 Google 定义的自动更新协议。这类错误表示设备在与更新服务器“沟通”时出了问题。
| 错误码 | 参数名称 | 含义解释 | 产生原因分析 |
|---|---|---|---|
| 30 | kOmahaRequestEmptyResponseError | 请求响应为空。 | 服务器返回了空数据,可能是服务器宕机、网络拦截或 URL 配置错误。 |
| 31 | kOmahaRequestXMLParseError | XML 解析错误。 | 服务器返回的数据格式不是合法的 XML,或者包含乱码,导致客户端无法解析。 |
| 35 | kOmahaResponseInvalid | 响应无效。 | 服务器返回了数据,但内容不符合 Omaha 协议的规范(例如缺少必要的字段)。 |
| 37 | kOmahaErrorInHTTPResponse | HTTP 响应错误。 | 网络层面的错误,如 404 (找不到资源)、500 (服务器内部错误) 或 403 (无权限)。 |
| 46 | kOmahaRequestXMLHasEntityDecl | XML 包含实体声明。 | 这是一个安全校验错误。为了防止 XXE 攻击,解析器拒绝处理包含 <!ENTITY> 声明的 XML 数据。 |
| 55 | kFirstActiveOmahaPingSentPersistenceError | 首次激活 Ping 发送持久化错误。 | 系统在记录“已发送首次激活信号”这一状态到磁盘时失败(通常是文件系统只读或空间不足)。 |
下载与元数据类错误
这类错误发生在从服务器下载 OTA 包,或者读取 OTA 包头部信息(Metadata)的阶段。
| 错误码 | 参数名称 | 含义解释 | 产生原因分析 |
|---|---|---|---|
| 32 | kDownloadInvalidMetadataSize | 元数据大小无效。 | 下载的 Metadata 文件大小为 0 或超出合理范围,说明下载不完整或服务器文件损坏。 |
| 33 | kDownloadInvalidMetadataSignature | 元数据签名无效。 | 严重安全问题。下载下来的 Metadata 文件的数字签名验证失败,说明文件可能被篡改或使用了错误的私钥签名。 |
| 38 | kDownloadOperationHashMissingError | 操作哈希缺失。 | Payload 中定义的某个具体操作步骤(Operation)缺少预期的 Hash 值,导致无法校验完整性。 |
| 39 | kDownloadMetadataSignatureMissingError | 元数据签名缺失。 | OTA 包中根本没有包含签名信息,这通常意味着打包脚本出错。 |
| 47 | kFilesystemVerifierError | 文件系统验证错误。 | 在写入分区前,对目标分区的文件系统进行检查时发现异常。 |
| 62 | kPackageExcludedFromUpdate | 包被排除在更新之外。 | 服务器策略告诉设备:“虽然有新包,但你的设备不在允许更新的白名单内”,因此主动放弃更新。 |
安装执行与系统状态类错误
这类错误发生在真正开始写入 Flash 存储、切换分区或重启的过程中。
| 错误码 | 参数名称 | 含义解释 | 产生原因分析 |
|---|---|---|---|
| 41 | kPostinstallPowerwashError | 安装后清除数据(Powerwash)错误。 | 升级完成后需要清除用户数据(恢复出厂设置)时失败了。通常是因为 /data 分区挂载问题或加密问题。 |
| 42 | kUpdateCanceledByChannelChange | 因通道变更取消更新。 | 用户在更新过程中切换了更新通道(例如从 Stable 切到了 Beta),系统为了安全会立即终止当前更新。 |
| 43 | kPostinstallFirmwareRONotUpdatable | 固件只读不可更新。 | 尝试更新某些只读(RO)的固件分区失败。 |
| 48 | kUserCanceled | 用户取消。 | 用户在设置界面手动点击了“暂停”或“取消”按钮。 |
| 50 | kOmahaUpdateIgnoredOverCellular | 蜂窝网络下忽略更新。 | 策略限制:系统检测到当前使用的是移动数据(4G/5G),且更新包过大或被配置为仅允许 Wi-Fi 更新。 |
| 52 | kUpdatedButNotActive | 已更新但未激活。 | 新系统已经写入到了备用分区(Slot B),但是未能成功将其标记为“启动分区”(Active)。重启后还是会进旧系统。 |
| 53 | kNoUpdate | 无更新。 | 这不是错误,而是正常状态。表示当前系统已经是最新版本,无需操作。 |
| 54 | kRollbackNotPossible | 无法回滚。 | 尝试降级失败。通常是因为防回滚计数器(Anti-rollback index)已经增加,硬件熔断机制阻止了刷入旧版本。 |
| 60 | kNotEnoughSpace | 空间不足。 | 设备的 /data 分区或缓存分区剩余空间不足以存放下载的安装包或进行解压操作。 |
| 61 | kDeviceCorrupted | 设备损坏。 | 检测到关键系统分区(如 Boot, System)的文件系统损坏,为了保护设备,停止更新。 |
| 63 | kPostinstallMountError | 安装后挂载错误。 | 更新写入完成后,尝试挂载新分区进行后续脚本执行时失败。 |
其他底层错误
| 错误码 | 参数名称 | 含义解释 |
|---|---|---|
| 36 | kOmahaUpdateDeferredForBackoff | 更新被推迟(退避算法)。 |
| 49 | kNonCriticalUpdateInOOBE | OOBE 期间的非关键更新。 |
| 57 | kInternalLibCurlError | LibCurl 内部错误。 |
| 58 | kUnresolvedHostError | 主机名无法解析。 |
| 59 | kUnresolvedHostRecovered | 主机名解析恢复。 |
快速排查
- 错误 51 (kPayloadTimestampError):设备当前分区时间戳 > Payload 中 max_timestamp,通常是刷了较新 vendor 后试图刷旧版本 OTA,或 SPL 日期倒退。检查 build.prop 中 ro.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 失败时:
- 首先看 Logcat:搜索 update_engine 关键字。
- 定位 Error Code:找到类似 ErrorCode: 51 的数字。
- 查阅此表:根据数字找到对应的含义
- 如果是 51,检查编译时间和手机系统时间
- 如果是 30/37,检查网络连通性和服务器状态
- 如果是 60,清理手机存储空间

