APM 模块与 Systemless 修改原理
什么是 APM
APM 全称 AndroidPatch Module,是 APatch 的模块系统——和 Magisk 的 Magisk Module 几乎一样的工作机制和文件格式。
模块系统的核心价值是 systemless 修改:在不触碰 Android 只读系统分区(/system、/vendor、/product)的前提下,实现安装字体、更换主题、添加系统属性、注入脚本等各种修改。
为什么叫 Systemless
Android 的系统分区(/system 等)在正常状态下是以只读方式挂载的——就算你有 root,直接写入也会触发 dm-verity 校验失败(dm-verity 会检测分区内容是否和出厂时的哈希值一致,不一致就拒绝启动)。
Magisk 和 APatch 的做法是:
- 不修改原始分区
- 在启动时把模块里的文件"叠加"到原始分区上面(overlayfs 机制)
- App 访问 /system/libxxx.so 时,实际上读到的是模块提供的修改版本
- 但原始的 /system 分区里的文件丝毫未变
这样做的好处:
- 升级系统(OTA)时,因为系统分区没被改动,OTA 包可以正常应用,不需要先卸载 root
- 要撤销修改,只需禁用/卸载模块,原始系统分区还是干净的
- dm-verity 检查始终通过,因为原始分区没变
APM 模块的目录结构
一个 APM 模块本质上是一个 zip 文件,解压后通常包含:
module/
├── module.prop # 模块元信息(名称、版本号、作者)
├── system/ # 要叠加到系统分区的文件
│ ├── lib/
│ │ └── xxx.so # 替换 /system/lib/xxx.so
│ └── build.prop # 追加到 system/build.prop
├── system.prop # 要追加的系统属性(另一种写法)
├── sepolicy.rule # SELinux 规则
├── busybox/ # 额外的二进制工具
├── service.d/ # post-fs-data 脚本(开机时自动执行)
├── post-fs-data.sh # post-fs-data 脚本
└── uninstall.sh # 卸载脚本
和 Magisk 模块的兼容性
APatch 的模块实现来自对 KernelSU 模块系统的复制和修改,而 KernelSU 的模块格式就是抄 Magisk 的。这意味着:
- 绝大多数 Magisk 模块可以直接在 APatch 上安装——格式完全一样
- Magisk 模块作者不需要针对 APatch 单独适配
- Zygisk 等依赖 Magisk 内部机制的模块需要额外兼容层(详见兼容生态章节)
模块的存储位置
APM 模块安装后会存放在 /data/adb/ap/modules/ 目录下。
关于元模块
APatch 还支持 KernelSU 的元模块(Meta-Module)系统——把核心 mount 实现从内核里拆出来变成可插拔模块,目前可用的有 overlayfs、magic mount 等实现。详见元模块章节。