模块是以 root 在开机阶段运行的代码包,不是主题商店插件。本教程让你在自有备用机上审计一个来源清晰、功能单一的模块 ZIP,安装前先证明 ADB 与该设备专用的原厂恢复路径可用,安装后只验证一个效果并完整撤销。
你会完成什么#
- 识别
module.prop、安装脚本、启动脚本、overlay、二进制与网络下载行为。 - 对作者、Release、commit、ABI、哈希、写入路径和卸载说明做最小供应链审计。
- 一次只安装一个低风险模块并观察完整重启周期。
- 通过禁用、卸载或官方救援命令回到无模块基线。
先看结论#
| ZIP 特征 | 风险判断 | 行动 |
|---|---|---|
| 有源码、tag 对应 Release、只改少量属性、清楚支持版本 | 可作为练习候选 | 仍需哈希、脚本和回滚审计 |
含 service.sh 或 system overlay | 中等 | 阅读每条命令,一次只改一个功能 |
含 post-fs-data.sh、native binary 或 sepolicy.rule | 高 | 新手第一次不选,早期开机错误可致 bootloop |
| 要求 permissive、全局 root 或从短链下载 payload | 不接受 | 停止并删除下载物 |
心智模型#
模块 ZIP → 安装器审计 → /data/adb/modules/<id>
├─ post-fs-data:早期、阻塞、风险高
├─ service:后期、通常非阻塞
└─ system overlay / props / policy
开机异常 → Safe Mode/ADB → disable/remove → 重启 → 设备专用原厂恢复兜底
“Systemless”通常表示借启动时挂载覆盖系统视图,而不是直接改只读 system 分区;它不代表无风险。脚本仍可能以 UID 0 改属性、策略和文件,甚至联网下载第二阶段内容。
工具清单#
| 工具 | 角色 | 什么时候用 | 来源与注意 |
|---|---|---|---|
| 解压与文本查看器 | 离线审计 ZIP | 安装前 | 不执行包内脚本,只阅读 |
| SHA-256 | 绑定 Release 与本地文件 | 下载后、归档时 | 页面哈希应来自作者可信渠道 |
| Magisk App/CLI | 安装、禁用和救援 | 审计通过后 | 首次不使用“一键装机包” |
| MMRL | 浏览模块元数据 | 发现候选时 | 索引展示不等于安全审核或作者背书 |
adb | 模块 bootloop 救援 | 电脑已提前授权时 | 无法在开机前临时补授权 |
项目全景:Magisk 模块的 3 个项目,一个不漏#
这个子类只有三个项目,因此按具体职责拆分,而不是虚构庞大生态:两个 adb root 实现分别核对维护状态,一个 TCL Flip 2 模块说明按键/应用重映射;共同的安装、救援和卸载原则放在结尾串联。
| 技术路线 | 项目数 | 处理等级 | 在主题任务中的位置 |
|---|---|---|---|
| ADB root:有说明的实现 | 1 | 候选路线 | 用 wuxianlin/adb_root 解释生产版 adbd、USB 调试授权和为什么 adb root 会扩大物理连接风险。只在备用机验证,并记录卸载模块后的 adbd 身份。 |
| ADB root:最小元数据项目 | 1 | 候选路线 | tiann/adb_root 缺少仓库描述,应以 README、提交时间和脚本内容补足判断,不能只因作者知名就默认兼容。与另一实现并列比较文件、服务和回滚差异。 |
| 设备专用应用重映射 | 1 | 候选路线 | 用 tadateruu/signalremap 展示模块如何在 TCL Flip 2 上替换默认短信入口。强调设备、包名和前置项目约束,并用禁用模块恢复原始行为。 |
1. ADB root:有说明的实现 · 1#
用 wuxianlin/adb_root 解释生产版 adbd、USB 调试授权和为什么 adb root 会扩大物理连接风险。只在备用机验证,并记录卸载模块后的 adbd 身份。
本组共 1 项:1 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| wuxianlin/adb_root | 主题用途:将 wuxianlin/adb_root 纳入「ADB root:有说明的实现」候选路线,根据 Shell 核对功能、平台与版本适配。 上游自述(保留原文):Magisk module to enable adb root | 未归档源项目 · ★ 52 · 协议未声明 · 2024-06-27。边界命中:先读 README,确认它确实属于当前任务,再决定是否使用。 |
2. ADB root:最小元数据项目 · 1#
tiann/adb_root 缺少仓库描述,应以 README、提交时间和脚本内容补足判断,不能只因作者知名就默认兼容。与另一实现并列比较文件、服务和回滚差异。
本组共 1 项:1 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| tiann/adb_root | 主题用途:将 tiann/adb_root 纳入「ADB root:最小元数据项目」候选路线,根据 Shell 核对功能、平台与版本适配。 上游自述(保留原文):未提供仓库简介 | 未归档源项目 · ★ 281 · NOASSERTION · 2026-03-26。边界命中:先读 README,确认它确实属于当前任务,再决定是否使用。 |
3. 设备专用应用重映射 · 1#
用 tadateruu/signalremap 展示模块如何在 TCL Flip 2 上替换默认短信入口。强调设备、包名和前置项目约束,并用禁用模块恢复原始行为。
本组共 1 项:1 个源项目、0 个 Fork,其中 0 项已归档。新手应先从“未归档的源项目”核对 README 和 Release,再用 Fork 追溯设备适配或历史差异;分组本身不等于推荐安装。
| 项目 | 上游定位与识别信号 | 状态与采用前检查 |
|---|---|---|
| tadateruu/signalremap | 主题用途:将 tadateruu/signalremap 纳入「设备专用应用重映射」候选路线,根据 Shell 核对功能、平台与版本适配。 上游自述(保留原文):TCL Flip 2 Magisk module that launches another messenger app instead of com.android.mms. Requires root, check out neutronscott's flip2 repo first. | 未归档源项目 · ★ 5 · 协议未声明 · 2025-10-15。边界命中:先读 README,确认它确实属于当前任务,再决定是否使用。 |
开始前#
确认基础 Root 已稳定至少两次重启,保存 Magisk 版本、Android/build、ABI、现有模块列表、实际被 Magisk 修改目标的原厂镜像,以及完整厂商恢复包与说明。打开 USB debugging,在这台电脑上实际运行 adb devices 并确认授权;记录本机进入安全模式/bootloader/下载模式的按键。Samsung 必须准备完整 Odin 恢复与清数据路径,不能把单刷 boot、init_boot、recovery 或 vbmeta 当回滚。选一个不涉及 SystemUI、SELinux、认证或 adbd 的小模块作为练习。
截至 2026-08-09,模块索引与模块作者仍是两层信任关系;同名仓库也可能属于不同 owner。必须从索引回到原项目核对 owner、tag、commit、签名和支持范围。
操作步骤#
1. 解压并建立内容清单#
在电脑复制 ZIP 后计算哈希并解压到隔离目录。读取 module.prop 的 id、version、author 与 updateJson;列出 customize.sh、post-fs-data.sh、service.sh、system.prop、sepolicy.rule、system/ 和二进制。搜索 curl、wget、su、setenforce、rm、dd 与远程 URL,并写下每个命令的目标。
2. 给候选模块做准入审计#
把 Release tag 对应到源码 commit,检查支持的 Android、Magisk 与 ABI,确认产物没有未知 native blob。评估它在开机哪个阶段运行、写哪些路径、是否改变 SELinux 或网络配置,以及卸载能否恢复。无法解释的命令不是“可能没事”,而是拒绝准入。
3. 安装一个并验证单一效果#
截图/导出现有模块列表,在 Magisk 中选择本地 ZIP,阅读安装日志后再重启。首次启动留出正常时间,不连续强制重启。只检查模块声明的一个效果,同时复测开机、解锁、无线、相机和设置;保存 adb logcat 中与模块 id 相关的异常。
4. 撤销并演练救援#
正常可启动时先在 Magisk 禁用模块、重启验证效果消失,再卸载并重启。若模块导致 bootloop 且 ADB 可用,先明确接受破坏范围:官方救援命令 adb shell magisk --remove-modules 会删除全部已安装模块并自动重启,不是只删本次模块;能读取清单时先保存,再执行一次。若 ADB 不可用,走已记录的安全模式或设备专用原厂恢复:非 Samsung 只恢复经该机型文档确认、且确实被 Root 方案修改的目标镜像;Samsung 走完整 Odin 恢复并按官方要求清数据,绝不单刷 boot/init_boot/recovery/vbmeta。不要在故障状态再安装“修复模块”。
验证#
| 阶段 | 可观察证据 | 验收标准 |
|---|---|---|
| 审计 | 文件树、脚本目标、来源、哈希与 ABI 都有记录 | 没有无法解释的下载或高危命令 |
| 安装 | 安装日志与模块 id/version 对应 | 没有额外模块或隐式 payload |
| 效果 | 只有声明的功能变化,系统关键功能正常 | 完整重启后仍可复现 |
| 撤销 | 禁用后效果消失,卸载后目录/列表恢复 | 再重启一次仍是无模块基线 |
把“ADB 已连接”也纳入验证:授权必须在出问题之前完成。若设备只在 Android 完全启动后才出现,不能把它当成早期开机救援保证。
排错#
| 现象 | 常见原因 | 安全处理 |
|---|---|---|
| 安装器报格式错误 | ZIP 结构、下载损坏或非 Magisk 模块 | 比对 hash 与上游格式,不改扩展名硬装 |
| 开机很慢/循环 | post-fs-data、policy 或二进制不兼容 | 走已验证的禁用/移除路径,再按设备与 Root 安装方式执行完整原厂恢复 |
| 效果不存在 | 版本、ABI、路径或执行阶段不匹配 | 读取日志并卸载,不叠加同类模块 |
| 卸载后仍残留 | 模块写了非 systemless 数据或 App 缓存 | 根据审计记录恢复明确目标;未知时回备份而非乱删 |
| OTA 后异常 | 模块与新系统/挂载布局冲突 | 更新前禁用,更新后按新 build 重新审计 |
完成清单#
- ZIP 的 owner、Release、commit、SHA-256、Android/Magisk/ABI 支持已核对。
- 已阅读全部安装与开机脚本,并能解释网络、写入和 policy 行为。
- 已提前验证 ADB、按键救援、实际修改目标的原厂镜像与完整厂商恢复,而非出错后才准备。
- 一次只安装一个低风险、单一用途模块。
- 已验证声明效果与系统关键功能,没有把“能开机”当唯一成功标准。
- 已完成禁用、卸载和再重启,证明能够恢复基线。