Android 分区升级学习总结

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. 升级包不匹配

相关推荐
一壶浊酒伴余生12 小时前
新概念英语第一册 · 句法笔记
笔记·英语学习·英语语法·新概念英语
蒸蒸yyyyzwd15 小时前
后端学习笔记 day111
笔记·学习
叼烟扛炮16 小时前
[LangChain] 学习笔记(08):工具调用底层闭环与第三方搜索(Tavily)实战
人工智能·笔记·学习·langchain
江屿风17 小时前
【Git-组件】【Git入门:从文档灾难到版本掌控】流食般投喂
运维·笔记·git·组件·版本控制
小李不想当小白18 小时前
HAL库之UART(STM32 HAL库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
旖旎夜光19 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
旖旎夜光20 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
叼烟扛炮1 天前
[LangChain] 学习笔记(07):大模型长出手脚——工具(Tools)定义与调用闭环
笔记·学习·langchain
叼烟扛炮1 天前
[LangChain] 学习笔记(06):突破大模型限制——结构化输出(Structured Output)
windows·笔记·学习·langchain
且从容.1 天前
VUE3学习笔记(根据黑马教程总结)
笔记·学习