菜单

架构

相关源文件

本页面介绍了Magisk的高层架构和核心系统。它概述了Magisk的组件如何协同工作,为Android设备提供root权限、系统修改和模块支持。有关特定子系统的详细信息,请参阅相应页面:启动过程模块系统文件系统操作

系统概览

Magisk采用一种专门的架构,允许它在不修改实际系统文件的情况下修改Android系统。相反,它结合了启动镜像打补丁、init劫持和挂载命名空间,以创建一个“无系统”的环境,通过挂载操作在运行时进行修改。

来源:native/src/core/lib.rs24-44 native/src/core/daemon.cpp15-25 native/src/init/init.hpp1-41

核心组件

Magisk的架构包含多个相互依赖的组件,共同提供其功能

1. MagiskD (守护进程)

Magisk守护进程(magiskd)是启动后管理所有Magisk功能的中心组件。它在Rust中实现为单例,并协调所有其他系统。

该守护进程在Android启动过程中启动并保持运行,以

  • 处理root访问请求
  • 管理模块加载和挂载
  • 处理隐藏/拒绝列表强制执行
  • 管理Zygisk注入
  • 通过阶段(post-fs-data、late_start、boot_complete)响应系统事件

来源:native/src/core/daemon.rs14-220 native/src/core/daemon.cpp15-492

2. 初始化系统 (magiskinit)

magiskinit是启动时第一个运行的Magisk组件。它取代了原始的Android init并

  • 修补SELinux策略以允许Magisk运行
  • 为Magisk设置环境
  • 挂载必要的文件系统
  • 以修改后的设置启动真正的Android init

来源:native/src/init/init.hpp1-41 native/src/init/lib.rs1-124 native/src/init/selinux.rs15-122

3. Root 访问管理器

管理应用程序的超级用户访问请求,实施一个权限系统来决定哪些应用程序可以获得root权限

来源:native/src/core/su/db.rs1-134 native/src/core/su/daemon.rs1-300 native/src/core/su/connect.cpp1-234

4. 拒绝列表系统

拒绝列表(以前称为MagiskHide)可防止选定的应用程序检测到Magisk的存在

来源:native/src/core/deny/utils.cpp18-441

5. Zygisk 框架

Zygisk是Magisk的代码注入框架,通过Zygote进程注入应用程序进程

来源:native/src/core/zygisk/entry.cpp1-121

启动顺序

Magisk 的初始化遵循 Android 启动过程中的精心编排的顺序

来源:native/src/core/daemon.rs182-214 native/src/init/mount.cpp146-211 native/src/init/rootdir.cpp46-148

模块系统架构

模块系统允许通过标准化格式扩展Magisk的自定义修改

模块被组织为目录,其中包含决定其行为的特定文件

文件目的
module.prop包含模块的元数据
system.prop要设置的系统属性
service.sh在late_start阶段执行的脚本
post-fs-data.sh在post-fs-data阶段执行的脚本
uninstall.sh卸载模块时执行的脚本
system/包含要覆盖挂载到system目录下的文件
zygisk/包含Zygisk原生库的目录

来源:native/src/core/module.cpp28-130 native/src/core/module.cpp280-324 native/src/core/node.hpp30-260

文件系统操作

Magisk实现了一个复杂的挂载系统,可以在不修改实际文件的情况下修改Android文件系统

挂载系统使用多种节点类型来表示不同的文件系统元素

  • tmpfs_node:创建一个可写的tmpfs覆盖层
  • module_node:表示要挂载的模块文件
  • root_node:分区的节点树根节点
  • magisk_node:Magisk二进制文件的特殊节点

来源:native/src/core/module.cpp127-186 native/src/base/mount.rs1-78

数据库系统

Magisk维护一个SQLite数据库来存储各种设置和状态信息

数据库存储

  • Root访问设置和权限
  • 模块信息
  • 拒绝列表条目
  • 配置选项
  • 管理器应用信息

来源:native/src/core/db.rs1-360 native/src/core/sqlite.cpp1-100

进程间通信

Magisk 组件通过各种 IPC 机制相互以及与客户端应用程序通信。

来源:native/src/core/socket.rs1-258 native/src/core/daemon.cpp401-440

结论

Magisk 的架构设计充分考虑了模块化、灵活性和安全性。无系统(Systemless)的方法允许它在不修改实际系统文件的情况下修改 Android 的行为,与传统的 root 解决方案相比,它更安全且更易于更新。各个组件协同工作,为 root 访问、系统修改和模块支持提供完整的解决方案。