Android13已经要求强制开启AB分区升级,不再使用之前的recovery模式升级
主要的回调函数区别:
| 回调函数 | 核心关注 | 触发阶段 | 典型用途 |
|---|---|---|---|
| onUpdaterStateChange | 更新器状态流转 | 状态切换时 | 控制 UI 流程(如页面跳转) |
| onEngineStatusUpdate | 引擎内部状态 | 引擎状态变化时 | 判断当前处于下载/校验/写入等阶段 |
| onEnginePayloadApplicationComplete | 写入结果 | 写入完成后 | 判断成功/失败,决定是否重启 |
| onProgressUpdate | 进度数值 | 持续更新中 | 刷新进度条 |
onUpdaterStateChange
对应如下几种状态:
java
UpdaterState.java
public static final int IDLE = 0;
public static final int ERROR = 1;
public static final int RUNNING = 2;
public static final int PAUSED = 3;
public static final int SLOT_SWITCH_REQUIRED = 4;
public static final int REBOOT_REQUIRED = 5;
有些场景会出现看不到IDLE,RUNNING 回调。

onEngineStatusUpdate
对应引擎内部状态
java
UpdateEngineStatuses.java
public static final int STATUS_UPDATED_NEED_REBOOT = 6;
static {
STATUS_MAP.put(0, "IDLE");
STATUS_MAP.put(1, "CHECKING_FOR_UPDATE");
STATUS_MAP.put(2, "UPDATE_AVAILABLE");
STATUS_MAP.put(3, "DOWNLOADING");
STATUS_MAP.put(4, "VERIFYING");
STATUS_MAP.put(5, "FINALIZING");
STATUS_MAP.put(6, "UPDATED_NEED_REBOOT");
STATUS_MAP.put(7, "REPORTING_ERROR_EVENT");
STATUS_MAP.put(8, "ATTEMPTING_ROLLBACK");
STATUS_MAP.put(9, "DISABLED");
}
上图,状态11可忽略。
完整的状态参考:
java
system/update_engine/client_library/include/update_engine/update_status.h
enum class UpdateStatus {
IDLE = 0,
CHECKING_FOR_UPDATE = 1,
UPDATE_AVAILABLE = 2,
DOWNLOADING = 3,
VERIFYING = 4,
FINALIZING = 5,
UPDATED_NEED_REBOOT = 6,
REPORTING_ERROR_EVENT = 7,
ATTEMPTING_ROLLBACK = 8,
DISABLED = 9,
// Broadcast this state when an update aborts because user preferences do not
// allow updates, e.g. over cellular network.
NEED_PERMISSION_TO_UPDATE = 10,
CLEANUP_PREVIOUS_UPDATE = 11,
// This value is exclusively used in Chrome. DO NOT define nor use it.
// TODO(crbug.com/977320): Remove this value from chrome by refactoring the
// Chrome code and evantually from here. This is not really an operation or
// state that the update_engine stays on. This is the result of an internal
// failure and should be reflected differently.
// ERROR = -1,
};
onEnginePayloadApplicationComplete
对应引擎内部的执行结果。
java
UpdateEngineErrorCodes.java
static {
CODE_TO_NAME_MAP.put(0, "SUCCESS");
CODE_TO_NAME_MAP.put(1, "ERROR");
CODE_TO_NAME_MAP.put(4, "FILESYSTEM_COPIER_ERROR");
CODE_TO_NAME_MAP.put(5, "POST_INSTALL_RUNNER_ERROR");
CODE_TO_NAME_MAP.put(6, "PAYLOAD_MISMATCHED_TYPE_ERROR");
CODE_TO_NAME_MAP.put(7, "INSTALL_DEVICE_OPEN_ERROR");
CODE_TO_NAME_MAP.put(8, "KERNEL_DEVICE_OPEN_ERROR");
CODE_TO_NAME_MAP.put(9, "DOWNLOAD_TRANSFER_ERROR");
CODE_TO_NAME_MAP.put(10, "PAYLOAD_HASH_MISMATCH_ERROR");
CODE_TO_NAME_MAP.put(11, "PAYLOAD_SIZE_MISMATCH_ERROR");
CODE_TO_NAME_MAP.put(12, "DOWNLOAD_PAYLOAD_VERIFICATION_ERROR");
CODE_TO_NAME_MAP.put(15, "NEW_ROOTFS_VERIFICATION_ERROR");
CODE_TO_NAME_MAP.put(20, "DOWNLOAD_STATE_INITIALIZATION_ERROR");
CODE_TO_NAME_MAP.put(26, "DOWNLOAD_METADATA_SIGNATURE_MISMATCH");
CODE_TO_NAME_MAP.put(29, "DOWNLOAD_METADATA_HASH_MISMATCH");
CODE_TO_NAME_MAP.put(48, "USER_CANCELLED");
CODE_TO_NAME_MAP.put(52, "UPDATED_BUT_NOT_ACTIVE");
}
onProgressUpdate
对应每一步的状态和进度。
典型调用顺序
onUpdaterStateChange(CHECKING)
→ onEngineStatusUpdate(CHECKING_FOR_UPDATE)
→ onUpdaterStateChange(DOWNLOADING)
→ onEngineStatusUpdate(DOWNLOADING)
→ onProgressUpdate(10%) ... onProgressUpdate(100%)
→ onEngineStatusUpdate(VERIFYING)
→ onEngineStatusUpdate(FINALIZING)
→ onEnginePayloadApplicationComplete(SUCCESS)
→ onUpdaterStateChange(COMPLETE)
log 分析
1 升级成功log


05-08 10:51:47.214 19141 19165 com.example.android.systemupdatersample D UpdateManager onStatusUpdate invoked, status=3, progress=0.67
这只是表示在status=3 (下载状态)的0.67进度



2. 升级包不匹配



