菜单

OTA 更新存活

相关源文件

目的与范围

本文档详细介绍了 Magisk 如何在系统通过 OTA(空中下载)更新后保持其在设备上的存在。内容涵盖了 Magisk 用于应对系统更新的机制,包括适用于自定义 ROM 的自动化方法以及适用于原生 Android 更新的程序。

有关初始启动镜像打补丁的信息,请参阅 启动镜像打补丁

OTA 续存概述

当设备接收到系统更新时,启动镜像(Magisk 驻留之处)通常会被新的原生版本替换。如果没有干预,这将导致 Magisk 从系统中移除。Magisk 实施了两种主要策略来应对这些更新:

  1. 自定义 ROM 解决方案:通过 addon.d 脚本实现自动化续存
  2. 原生 ROM 解决方案:更新安装后手动重新打补丁

来源:scripts/addon.d.sh1-129 scripts/util_functions.sh530-541

A/B 分区支持

现代 Android 设备通常使用 A/B 分区方案来实现无缝更新。Magisk 的 OTA 续存机制同时支持传统分区和 A/B 分区设备。

来源:scripts/util_functions.sh274-305 scripts/addon.d.sh100-107

addon.d 实现

对于支持 addon.d 框架的自定义 ROM,Magisk 提供了一个自动续存脚本。该脚本安装到 /system/addon.d/99-magisk.sh,并在 ROM 更新过程中执行。

addon.d 的工作原理

addon.d 框架在更新过程的不同阶段调用特定的函数:

功能目的时间点
pre-backup从现有分区保存配置备份阶段之前
backupMagisk 中无操作(在其他地方处理)备份阶段期间
pre-restoreMagisk 中无操作恢复阶段之前
post-restore系统更新后重新安装 Magisk系统恢复后

来源:scripts/addon.d.sh128-168 scripts/flash_script.sh80-88

OTA 续存技术实现

处理 A/B 插槽设备

对于采用 A/B 分区方案的设备,Magisk 必须识别并适应插槽切换。

来源:scripts/util_functions.sh274-282 scripts/addon.d.sh100-107

启动镜像检测

Magisk 必须在更新后识别正确的启动镜像进行打补丁。

来源:scripts/util_functions.sh370-392

迁移和备份

Magisk 维护原始启动镜像的备份,以便在需要时进行 OTA 续存和恢复。

来源:scripts/util_functions.sh532-587

addon.d 脚本的自动安装

当 Magisk 以可刷写模式安装时,如果系统支持,它会自动安装 addon.d 脚本。

来源:scripts/flash_script.sh80-88

OTA 后安装 Magisk

OTA 更新后重新安装 Magisk 的核心功能。

来源:scripts/util_functions.sh419-441

OTA 续存故障排除

当 addon.d 脚本未能找到 Magisk 二进制文件时(通常由于数据被擦除或未解密),它会显示错误消息以指导用户。

来源:scripts/addon.d.sh28-41

实际考量

  1. 数据加密:如果数据已加密且在恢复期间未解密,addon.d 续存可能会失败。
  2. A/B 与非 A/B:根据分区方案需要不同的处理方式。
  3. 自定义 ROM 与原生 ROM:策略因 ROM 类型而异。
  4. 备份保护:Magisk 维护备份以从失败的 OTA 流程中恢复。

这种全面的 OTA 续存方法确保用户在设备接收系统更新时,无论设备采用何种更新机制或分区方案,都能保持 root 访问权限和 Magisk 功能。

来源:scripts/addon.d.sh1-169 scripts/util_functions.sh419-441 scripts/util_functions.sh532-587