APatch 中文文档 下载 App

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 的做法是:

  1. 不修改原始分区
  2. 在启动时把模块里的文件"叠加"到原始分区上面(overlayfs 机制)
  3. App 访问 /system/libxxx.so 时,实际上读到的是模块提供的修改版本
  4. 但原始的 /system 分区里的文件丝毫未变

这样做的好处:

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 的。这意味着:

模块的存储位置

APM 模块安装后会存放在 /data/adb/ap/modules/ 目录下。

关于元模块

APatch 还支持 KernelSU 的元模块(Meta-Module)系统——把核心 mount 实现从内核里拆出来变成可插拔模块,目前可用的有 overlayfs、magic mount 等实现。详见元模块章节。