# 模块(APM)开发指南 {#introduction} APatch 提供了一个模块机制( AndroidPatch Module),它可以在保持系统分区完整性的同时达到修改系统分区的效果;这种机制通常被称之为 systemless。 APatch 的模块实现是从 [KernelSU](https://github.com/tiann/KernelSU) 模块复制并修改而来,感谢 KernelSU。 具体修改的代码对应位置: KernelSU: [https://github.com/tiann/KernelSU/tree/main/userspace/ksud](https://github.com/tiann/KernelSU/tree/main/userspace/ksud) APatch: [https://github.com/bmax121/APatch/tree/main/apd](https://github.com/bmax121/APatch/tree/main/apd) 以下的文档内容也是从 KernelSU 的文档复制并修改而来,其中大部分的内容是一致。需要注意的主要有以下几个地方 1. 文件位置 2. 环境变量 3. SELinux 支持,APatch 直接使用了 magiskpolicy APatch 的模块运作机制与 Magisk 几乎是一样的,如果你熟悉 Magisk 模块的开发,那么开发 APatch 的模块大同小异,你可以跳过下面有关模块的介绍,只需要了解 [APatch 模块与 Magisk 模块的异同](difference-with-magisk.md)。 ## Busybox APatch 提供了一个功能完备的 BusyBox 二进制文件(包括完整的SELinux支持)。可执行文件位于 `/data/adb/ap/bin/busybox`。 APatch 的 BusyBox 支持运行时可切换的 "ASH Standalone Shell Mode"。 这种独立模式意味着在运行 BusyBox 的 ash shell 时,每个命令都会直接使用 BusyBox 中内置的应用程序,而不管 PATH 设置为什么。 例如,`ls`、`rm`、`chmod` 等命令将不会使用 PATH 中设置的命令(在Android的情况下,默认情况下分别为 `/system/bin/ls`、`/system/bin/rm` 和 `/system/bin/chmod`),而是直接调用 BusyBox 内置的应用程序。 这确保了脚本始终在可预测的环境中运行,并始终具有完整的命令套件,无论它运行在哪个Android版本上。 要强制一个命令不使用BusyBox,你必须使用完整路径调用可执行文件。 在 APatch 上下文中运行的每个 shell 脚本都将在 BusyBox 的 ash shell 中以独立模式运行。对于第三方开发者相关的内容,包括所有启动脚本和模块安装脚本。 对于想要在 APatch 之外使用这个“独立模式”功能的用户,有两种启用方法: 1. 设置环境变量 `ASH_STANDALONE` 为 `1`。例如:`ASH_STANDALONE=1 /data/adb/ap/bin/busybox sh