插件结构与 module.prop 如何写一个合法的插件
插件目录结构
AxManager 插件是一个文件夹,放在指定路径下。完整结构如下:
插件文件夹/
├── module.prop ← 必填,模块元数据
├── system/ ← 可选,模块的文件内容
│ └── bin/ ← 会被加入 PATH
├── post-fs-data.sh ← 可选,启动时同步执行
├── service.sh ← 可选,启动时延迟执行
├── uninstall.sh ← 可选,卸载时执行
├── action.sh ← 可选,用户点击操作按钮时执行
├── system.prop ← 可选,系统属性覆盖
├── disable ← 可选,存在则模块被禁用
├── remove ← 可选,存在则下次重启时删除
└── ... ← 其他任何文件
module.prop 必填配置
module.prop 是每个插件必须有的配置文件,AxManager 通过它识别和加载插件。
配置格式:每行一个 键=值,使用 UNIX(LF)换行。
必填字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 唯一标识符,匹配正则 ^[a-zA-Z][a-zA-Z0-9._-]+$ |
| name | string | 模块显示名称 |
| version | string | 版本号字符串,如 v1.0.0 |
| versionCode | int | 版本号整数,用于比较版本高低 |
| author | string | 作者名称 |
| description | string | 模块描述 |
| axeronPlugin | int | 目标 AxManager 服务器版本号 |
重要:axeronPlugin 的值必须小于或等于当前 AxManager 的服务器版本。如果插件声明需要更高版本,安装会被拒绝。
Shell 脚本钩子
插件支持多个生命周期脚本,与 Magisk 模块类似但执行时机不同:
| 脚本 | 触发时机 | 用途 |
|---|---|---|
| post-fs-data.sh | BOOT_COMPLETED 广播首次同步执行 | 早期初始化 |
| service.sh | BOOT_COMPLETED 的 late_start service | 后台服务 |
| uninstall.sh | AxManager 卸载模块时 | 清理工作 |
| action.sh | 用户在 AxManager 应用中点击操作按钮 | 用户手动触发 |
脚本中的环境变量
在插件的 Shell 脚本中,AxManager 会注入以下环境变量:
| 变量 | 类型 | 说明 |
|---|---|---|
| AXERON | bool | 始终为 true,用于区分 AxManager/Magisk/KernelSU 环境 |
| AXERONVER | int | AxManager 服务器版本整数(如 10400) |
| MODDIR | path | 模块所在目录 |
| ARCH | string | 设备 CPU 架构(arm/arm64/x86/x64) |
| API | int | 设备 API 级别(Android 版本) |
| BOOTMODE | bool | 始终为 true |
实用技巧:在脚本中用 $AXERON 判断当前运行环境,这样同一份脚本可以在 AxManager、KernelSU、Magisk 中通用。
路径约定
在插件的 Shell 脚本中,使用以下方法获取路径:
MODDIR=${0%/*} ← 获取模块目录(除 customize.sh 外的所有脚本)
不要硬编码模块路径——AxManager 会负责正确设置 MODDIR,硬编码路径可能导致脚本在不同设备上行为不一致。
自定义安装脚本(customize.sh)中不使用 MODDIR,而是用 MODPATH 变量。
与 Magisk 模块的写法区别
脚本写法基本一致,主要区别在环境变量名和部分钩子的执行时机。但因为 AxManager 的 BusyBox 直接编译自 Magisk 项目,脚本的 shell 语法和命令兼容性完全相同——大部分 Magisk 模块的脚本可以直接搬到 AxManager 中使用。