前言
下面记录一下Android A/B OTA 升级 — update_engine 错误码完整参考中完整的参考码,以及相关的内容介绍和问题原因。
记录于此,方便自己查阅。
正文
Android A/B OTA 升级 — update_engine 错误码完整参考
AOSP system/update_engine/common/error_code.h
Java 层:android.os.UpdateEngine.ErrorCodeConstants
通用状态
| 错误码 | 枚举名 | 说明 |
|---|---|---|
| 0 | kSuccess | 升级成功 |
| 1 | kError | 通用失败(未归类错误) |
前置 / 请求 / 响应阶段
Omaha & 网络
| 码 | 枚举名 | 中文说明 |
|---|---|---|
| 2 | kOmahaRequestError | Omaha 请求发送失败(DNS/网络断开) |
| 3 | kOmahaResponseHandlerError | Omaha 响应处理逻辑异常 |
| 30 | kOmahaRequestEmptyResponseError | 服务器返回空响应 |
| 31 | kOmahaRequestXMLParseError | XML 响应解析失败 |
| 34 | kOmahaResponseInvalid | Omaha 响应内容非法 |
| 35 | kOmahaUpdateIgnoredPerPolicy | 因企业策略忽略本次更新 |
| 36 | kOmahaUpdateDeferredPerPolicy | 因策略条件未满足延迟更新 |
| 37 | kOmahaErrorInHTTPResponse | HTTP 状态码异常(404/500 等) |
| 40 | kOmahaUpdateDeferredForBackoff | 触发指数退避,暂缓重试 |
| 46 | kOmahaRequestXMLHasEntityDecl | XML 含实体声明(防 XXE 攻击拒收) |
下载 & Payload 元数据校验阶段
| 码 | 枚举名 | 中文说明 |
|---|---|---|
| 9 | kDownloadTransferError | 下载传输失败(网络中断/超时) |
| 12 | kDownloadPayloadVerificationError | Payload 整体签名校验失败 |
| 14 | kDownloadWriteError | 写入分区失败(磁盘 IO 错误) |
| 20 | kDownloadStateInitializationError | 下载状态初始化失败 |
| 21 | kDownloadInvalidMetadataMagicString | Metadata Magic 字符串不匹配(offset 错误常见) |
| 22 | kDownloadSignatureMissingInManifest | Manifest 中缺少签名声明 |
| 23 | kDownloadManifestParseError | Manifest 解析失败 |
| 24 | kDownloadMetadataSignatureError | Metadata 签名格式错误 |
| 25 | kDownloadMetadataSignatureVerificationError | Metadata 签名验签失败 |
| 26 | kDownloadMetadataSignatureMismatch | Metadata 签名不匹配 |
| 27 | kDownloadOperationHashVerificationError | 单条操作 Hash 校验异常 |
| 28 | kDownloadOperationExecutionError | 差分操作执行出错(bsdiff/imgpatch 失败) |
| 29 | kDownloadOperationHashMismatch | 操作数据 Hash 不匹配 |
| 32 | kDownloadInvalidMetadataSize | Metadata 大小与声明不一致 |
| 33 | kDownloadInvalidMetadataSignature | Metadata 签名非法 |
| 38 | kDownloadOperationHashMissingError | 操作缺少 Hash(无法校验完整性) |
| 39 | kDownloadMetadataSignatureMissingError | Metadata 缺少签名 |
安装 & Post-install 阶段
| 码 | 枚举名 | 中文说明 |
|---|---|---|
| 4 | kFilesystemCopierError | 文件系统拷贝错误(预留/兼容) |
| 5 | kPostinstallRunnerError | Post-install 脚本执行失败 |
| 6 | kPayloadMismatchedType | Payload 类型不支持(如全量/增量不匹配) |
| 7 | kInstallDeviceOpenError | 安装分区设备打开失败 |
| 8 | kKernelDeviceOpenError | Kernel 分区设备打开失败 |
| 10 | kPayloadHashMismatchError | Payload Hash 不匹配 |
| 11 | kPayloadSizeMismatchError | Payload 大小不匹配 |
| 13 | kDownloadNewPartitionInfoError | 新分区信息读取失败 |
| 15 | kNewRootfsVerificationError | 新 RootFS 校验失败 |
| 16 | kNewKernelVerificationError | 新 Kernel 校验失败 |
| 17 | kSignedDeltaPayloadExpectedError | 期望签名增量包但未提供 |
| 18 | kDownloadPayloadPubKeyVerificationError | Payload 公钥校验失败 |
| 41 | kPostinstallPowerwashError | Post-install Powerwash(恢复出厂)失败 |
| 42 | kUpdateCanceledByChannelChange | 切换更新通道导致更新取消 |
| 43 | kPostinstallFirmwareRONotUpdatable | RO Firmware 不可更新 |
| 44 | kUnsupportedMajorPayloadVersion | Payload 主版本号不被支持 |
| 45 | kUnsupportedMinorPayloadVersion | Payload 次版本号不被支持 |
| 47 | kFilesystemVerifierError | 文件系统校验器报错 |
用户交互 & 特殊状态
| 码 | 枚举名 | 中文说明 |
|---|---|---|
| 48 | kUserCanceled | 用户手动取消更新 |
| 49 | kNonCriticalUpdateInOOBE | OOBE 初始化阶段忽略非关键更新 |
| 50 | kOmahaUpdateIgnoredOverCellular | 蜂窝网络下忽略大体积 OTA(需 Wi-Fi) |
| 51 | kPayloadTimestampError | Payload 时间戳早于当前系统(防降级) |
| 52 | kUpdatedButNotActive | 写入成功但未激活新 Slot(A/B 切换失败) |
| 53 | kNoUpdate | 服务器返回无可用的新版本 |
| 54 | kRollbackNotPossible | 不允许回滚到旧版本 |
| 60 | kNotEnoughSpace | 存储空间不足 |
| 61 | kDeviceCorrupted | 设备分区损坏,禁止继续更新 |
| 62 | kPackageExcludedFromUpdate | 指定包被排除在更新外 |
常见排错速查
- 错误 51 (kPayloadTimestampError):设备当前分区时间戳 > Payload 中 max_timestamp,通常是刷了较新 vendor 后试图刷旧版本 OTA,或 SPL 日期倒退。检查 build.prop 中 ro.build.date.utc 与 Payload manifest。3
- 错误 32 (kDownloadInvalidMetadataSize):调用 applyPayload 时传的 METADATA_SIZE 与包内实际大小不一致,常见于 offset/size 填错。4
- 错误 47 (kFilesystemVerifierError):post-install 校验新系统分区 hash 失败,多见于损坏的 OTA 包或闪存坏块。
- 错误 60 (kNotEnoughSpace):A/B 设备虽有两个 Slot,但仍需临时空间解压,建议保留 ≥ 预留大小 + payload 解压空间。
> 💡 调试时可通过 `adb logcat | grep update_engine` 或查看 `/data/misc/update_engine_log/` 下日志获取具体报错行号辅助定位。Java 层对应常量
// android.os.UpdateEngine.ErrorCodeConstants public static final int SUCCESS = 0; public static final int ERROR = 1; public static final int PAYLOAD_TIMESTAMP_ERROR = 51; public static final int UPDATED_BUT_NOT_ACTIVE = 52; public static final int NOT_ENOUGH_SPACE = 60; public static final int DEVICE_CORRUPTED = 61;

