ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

如何写出一个能跑的 Magisk 模块:从最小结构到验证排障的完整流程

如何写出一个能跑的 Magisk 模块:从最小结构到验证排障的完整流程 如何写出一个能跑的 Magisk 模块从最小结构到验证排障的完整流程【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk想在 Android 上改系统行为却不想重刷 ROMMagisk 模块让你用一个文件夹就能注入文件、属性和脚本。这篇教程带你做出一个最小可用模块讲清它如何被挂载、怎么打包安装、如何验证生效以及卡住时该查哪里。先建立一个心智模型模块到底改动了什么一个 Magisk 模块本质上就是/data/adb/modules/id/下的一个文件夹。启动时 Magisk 会扫描这个目录把里面的内容分三类消化掉位置它是什么谁、在什么时候消费它module.prop元数据id、版本、作者安装时读取id来定位目录system/系统覆盖层启动时按子树合并进/system、/vendor、/product、/system_extsystem.propkeyvalue属性加载进系统属性表post-fs-data.sh早期脚本/data可用、zygote 启动前执行受超时约束service.sh后期脚本系统服务就绪后执行不阻塞启动customize.sh安装期脚本刷入 zip 那一刻执行一次disable/remove标记文件下次启动决定是禁用还是彻底删除关键在于system/的合并方式Magisk 不是简单复制而是把模块的system子树逐一bind mount到对应真实分区。模块里放system/xbin/foo启动后/system/xbin/foo就会变成你的文件。想删除系统里的某个文件则用 whiteout空字符设备节点占位。这套逻辑实现见 native/src/core/module.rs。再看一次完整启动脚本在两个节点被拉起post-fs-data 阶段/data已挂载、zygote 尚未启动。先跑post-fs-data.d/下的公共脚本再依次跑各模块的post-fs-data.sh。这一阶段有硬超时当前实现限制在 35 秒内见 native/src/core/scripting.cpp 的计时与 docs/changes.md超时的脚本会被切到非阻塞模式重活别放这里。late_start 阶段系统服务基本就绪跑各模块的service.sh。适合拉起后台守护、写日志。boot-complete计数复位、恢复 Zygisk 等收尾。阶段调度在 native/src/core/bootstages.rs。装包那一刻另有其事install_module会把 zip 解到临时目录读取module.prop的id若存在customize.sh则执行它再把文件落到/data/adb/modules/id。相关逻辑在 scripts/util_functions.sh 的install_module()。做一个最小可用模块加一个属性 一个自定义命令我们从一个极小目标出发注入一条可查询的属性prop.demo.my再往system/xbin放一个能执行的命令myprop。这两个动作正好覆盖改属性和覆盖文件两条主线。最小文件清单只需四样目录结构如下myprop/ ├── module.prop # 元数据必须有 ├── system.prop # 注入的属性 └── system/ └── xbin/ └── myprop # 自定义命令元数据 module.prop模块的入口身份证id决定模块落哪个目录一旦确定就别改。下面是最小版本字段含义自解释idmyprop nameMy First Prop Module version1.0 versionCode1 authoryou descriptionAdds a demo property and a custom commandversionCode是整数用于版本比较version是展示用字符串。管理器就是靠这两个字段判断要不要更新。覆盖层 system/ 与 system.prop真正改写系统的部分system.prop每行一条keyvalue启动时被读进属性表prop.demo.myhello命令文件system/xbin/myprop就是一个普通可执行脚本装到xbin下会被授予 755 权限#!/system/bin/sh echo myprop is workingsystem/下你写的路径要照搬真实分区路径。想动/vendor下的东西就写成system/vendor/...system/vendor/bin的属主/SELinux 上下文由安装逻辑自动处理见set_default_perm。两个脚本安装期一次启动期每次customize.sh安装期只在刷入 zip 时执行一次。如果你的结构能被 Magisk 自动解包就不用写它只有当你想按架构挑文件、做兼容判断时才需要并靠SKIPUNZIP1接管解包#!/system/bin/sh SKIPUNZIP1 # 只把需要的文件挑出来 unzip -o $ZIPFILE system/xbin/myprop -d $MODPATH set_perm $MODPATH/system/xbin/myprop 0 2000 0755$MODPATH、$ZIPFILE、$API、$IS64BIT、set_perm这些变量和函数都是安装环境提供的别自己另起炉灶。service.sh启动期每次开机跑一次适合写日志、拉守护进程。下面这段在开机完成后记一条日志#!/system/bin/sh MODDIR$(cd $(dirname $0) pwd) while [ $(getprop sys.boot_completed) ! 1 ]; do sleep 1 done echo service ran at $(date) $MODDIR/service.log这里特意没在post-fs-data.sh里做等待就是为了不踩 35 秒超时——需要等系统就绪的逻辑一律放service.sh。打包与安装让模块真正加载把文件压成能被识别的 zip识别规则只有一条硬标准zip 根目录必须有module.prop否则install_module直接判定不是 Magisk 模块并中止。所以打包要在模块根目录内压缩别把myprop/整层套进去cd myprop zip -r ../myprop.zip . -x .* unzip -l ../myprop.zip最后一条unzip -l用来确认module.prop出现在 zip 的第一层。如果它显示成myprop/module.prop说明外层目录被带进去了模块必然不认。两种安装方式管理器 UI推荐模块页 → 从存储安装 → 选这个 zip → 提示重启后重启。命令行需 root慎用magisk install-module /path/to/myprop.zip再重启。这条会立即走install_module失败信息直接打到终端调试更快。验证闭环怎么确认模块真的生效先确认环境是好的。下面这张是管理器 Home 页用来核对 Magisk 核心与 App 的版本、Zygisk 状态——模块开发前应先确认核心已正常安装。加载完成后用下面这条链子逐个确认每步都对应一个明确判据getprop prop.demo.my应回显hello——说明system.prop被加载了。which myprop myprop应显示命令路径并输出myprop is working——说明system/覆盖层挂载成功、文件可执行。ls -l /data/adb/modules/myprop cat /data/adb/modules/myprop/service.log第一条确认模块目录、文件齐全第二条确认service.sh真的跑过。三条都通过才算这条闭环走通。失败时的回滚路径Magisk 内建了最关键的兜底连续两次启动失败会触发安全模式自动给所有模块打上disable见 native/src/core/bootstages.rs 的safe_mode分支。也就是说坏模块最多让你重启回干净状态不会砖。手动控制有三种禁用保留文件touch /data/adb/modules/myprop/disable重启。彻底删除touch /data/adb/modules/myprop/remove重启。若存在uninstall.sh删除前会先执行它做清理。重装覆盖直接装新版本 zip安装流程会清掉旧目录再落新文件。按症状排障现象 → 先查什么 → 怎么处理现象先查什么怎么处理装完管理器里看不到模块zip 第一层有没有module.prop重打包别套外层目录getprop拿不到属性system.prop是否在模块根目录、是否keyvalue无多余空格改路径与格式确认模块没被disable自定义命令跑不起来文件是否 755 可执行、路径是否真在system/xbin用set_perm补权限必要时加sepolicy.rule脚本卡住或被中断是否把长等待/重活写进了post-fs-data.sh移到service.sh或后台跑重启后进了安全模式、模块被禁用是否连续两次启动失败删掉问题脚本重装这是保护机制排障时最有用的两条命令是unzip -l看包结构和ls -l /data/adb/modules/id看落地结构。九成不生效问题都能在这两处定位。下一步可以往哪里扩跑通最小模块后三条进阶路线按需选择Zygisk 模块在zygisk/arm64-v8a.so、zygisk/armeabi-v7a.so放注入库在应用进程启动前介入做进程级能力。需先在管理器开启 Zygisk。自定义 SELinux 规则写sepolicy.rule放宽策略解决文件对了但被 SELinux 挡下的问题。卸载与多分区提供uninstall.sh做干净清理按system/vendor、system/product等多分区投放资源覆盖范围更全。想查现成的脚本约定与函数签名直接读 scripts/util_functions.sh 和 scripts/module_installer.sh 是最快的方式命令用法可参考 docs/tools.md背景概念见 docs/guides.md。【免费下载链接】MagiskThe Magic Mask for Android项目地址: https://gitcode.com/GitHub_Trending/ma/Magisk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表