本文档提供了 Magisk 的技术概述,Magisk 是一个用于 Android 的高级系统修改框架。Magisk 通过独特的基于挂载的方法,在不更改系统完整性的前提下,实现了 root 访问、系统修改和模块功能。本文概述了 Magisk 的核心架构、启动过程、模块系统和关键组件。
有关安装说明,请参阅单独的安装指南。有关开发信息,包括模块创建,请参阅开发指南。
Magisk 结合使用了早期启动初始化、守护进程和挂载命名空间,在不直接修改系统分区的情况下修改 Android 系统。
来源:native/src/core/daemon.cpp native/src/core/lib.rs native/src/core/module.cpp docs/details.md
init来源:native/src/core/daemon.rs native/src/core/zygisk/entry.cpp native/src/core/su/mod.rs
Magisk 的启动过程分为多个阶段,每个阶段负责特定的初始化任务。
来源:native/src/core/daemon.rs190-215 docs/details.md76-94
在预初始化阶段,magiskinit 替换 Android 的init进程并
init.rcinit以继续启动来源:native/src/core/daemon.rs102-121 docs/details.md79-86
此阶段发生在/data解密并挂载后
magiskd守护进程启动来源:native/src/core/daemon.rs124-155 docs/details.md88-90
在启动过程的后期,当触发 late_start 类时
来源:native/src/core/daemon.rs158-166 native/src/core/scripting.cpp120-151 docs/details.md92-94
启动过程的最后阶段
来源:native/src/core/daemon.rs168-183
Magisk 模块提供了一种在不实际修改系统分区的情况下修改 Android 系统的方法。
来源:docs/guides.md16-77 native/src/core/module.cpp283-321
Magisk 模块是一个位于 /data/adb/modules 目录下的目录,结构如下:
| 组件 | 描述 |
|---|---|
module.prop | 模块元数据(ID、名称、版本、作者) |
system/ | 将覆盖到系统上的文件 |
post-fs-data.sh | 在 post-fs-data 期间执行的脚本 |
service.sh | 在 late_start 服务期间执行的脚本 |
system.prop | 将加载为系统属性的属性 |
sepolicy.rule | 自定义 SELinux 策略规则 |
zygisk/ | 用于 Zygisk 集成的本地库 |
来源:docs/guides.md19-77 native/src/core/module.cpp283-321
Magisk 使用绑定挂载系统将模块文件覆盖到系统上
这种方法允许在不实际修改系统分区的情况下进行系统修改。
来源:native/src/core/module.cpp127-186 native/src/core/module.cpp283-321
MagiskSU 通过安全的授权系统为应用程序提供 root 访问权限。
来源: native/src/core/su/daemon.rs native/src/core/su/db.rs native/src/core/su/connect.cpp
Magisk守护进程通过以下方式管理root权限
来源: native/src/core/su/db.rs44-83 native/src/core/db.rs109-133
MagiskSU 包含多项安全功能
来源: native/src/core/su/daemon.rs115-164 docs/releases/25100.md14-23
Magisk 实现了一个复杂的挂载系统,可以在不改变实际分区的情况下修改 Android 的文件系统。
来源: native/src/core/module.cpp15-87 native/src/core/module.cpp283-321 native/src/core/node.hpp
Magisk 创建了各种挂载点和目录以供其运行
| 路径 | 描述 |
|---|---|
/data/adb/modules | Magisk 模块的存储 |
$MAGISKTMP/.magisk/modules | 为运行时使用的模块挂载 |
$MAGISKTMP/.magisk/mirror | 系统分区的镜像 |
$MAGISKTMP/.magisk/rootdir | Root目录补丁 |
其中 $MAGISKTMP$ 根据设备不同,可以是 /sbin 或 /debug_ramdisk。
来源: docs/details.md6-37 native/src/core/daemon.cpp427-440
“Magic Mount” 系统通过以下方式工作:
来源: native/src/core/module.cpp46-87 native/src/core/module.cpp127-186 native/src/core/node.hpp32-310
Magisk 将其配置和权限存储在 SQLite 数据库中。
来源: native/src/core/db.rs native/src/core/sqlite.cpp
数据库存储各种配置设置
| 设置 | 描述 |
|---|---|
root_access | Root 访问模式(禁用、仅应用、仅 ADB、应用和 ADB) |
multiuser_mode | 多用户设置(仅所有者、所有者管理、用户) |
mnt_ns | 挂载命名空间模式(全局、每个应用、隔离) |
denylist | 是否启用禁用列表 |
zygisk | 是否启用 Zygisk |
来源: native/src/core/db.rs59-87 native/src/core/db.rs239-272
Zygisk 提供了一种在应用程序进程初始化早期注入代码的方法。
来源: native/src/core/zygisk/entry.cpp native/src/core/module.cpp400-456
Zygisk 的工作方式是:
Zygisk 框架允许模块在应用程序进程被专门化和运行之前直接在其中运行代码,从而实现常规 Magisk 模块无法实现的高级修改。
来源: docs/guides.md129-132 native/src/core/zygisk/entry.cpp16-90 native/src/core/module.cpp400-456
Magisk 包含多种用于安装、管理和开发的实用工具。
| 工具 | 描述 |
|---|---|
magiskboot | 用于解包、打补丁和重新打包引导映像的工具 |
magiskinit | 引导过程中运行的第一个程序,初始化 Magisk |
magiskpolicy | 用于修改 SELinux 策略的工具 |
magisk | 具有各种功能的 मुख्य command-line utility |
resetprop | 用于修改系统属性的工具 |
su | 命令访问超级用户功能 |
来源: docs/tools.md2-14 docs/tools.md161-234
Magisk 通过以下方式处理 SELinux:
magiskmagisk_file 作为 Magisk 文件的文件类型这使得 Magisk 在维护 Android 的安全模型的同时能够运行。
Magisk 提供了一种强大但非破坏性的方式来修改 Android 系统。通过了解其架构和组件,开发者可以更有效地创建模块和扩展来增强 Android 的功能。
Magisk 方法的关键在于其基于挂载的修改系统,该系统在允许进行广泛自定义的同时,保持了系统分区的完整性。这种方法实现了诸如 root 访问、系统修改和高级模块支持等功能,而无需永久更改关键系统文件。