模块
这里列举几个常用的模块和相关刷入教程。
Magisk 模块仓库在很早就被官方移除,面具只能通过 zip 文件刷入模块,而 LSPosed 可以通过安装 APP 来启动模块(而不需要重启)。
模块安装
打开 模块 页面,点击 从本地ZIP安装 ,选择模块压缩包文件,然后等待刷入完毕。
一些模块仓库如下,推荐先装一个救砖模块,这个模块自己下面的仓库。
Danger
安装模块必须审计模块脚本!如果你不会 sh ,那么请从可靠信源下载模块文件或者论坛提问求助/搜索。
模块的文件地址/sbin/.magisk/img
,如果你没有这个软链接,可以去 /data/adb/modules
查看。
如果没有安装救砖模块,可以在 cache
目录下面建立一个 disable_magisk
文件,禁用掉进系统,进了系统再把插件删了。
装模块装砖了
装了不兼容的模块,导致手机无法进入系统了!怎么办?下面是一些解决方案。3
救砖模块
社区中有一种自动救砖模块可以使用。你可以在仓库中下载。
ADB 保险
Magisk 从2019年其实施了一项故障保险,如果你的 Xposed 使用 Magisk(自从 Oreo 之后就没有使用 Xposed)它会起作用。
如果启用了 adb 调试
将不断重复开机的手机关机,用数据线链接手机电脑,打开 ADB 环境(前文已经叙述)
电脑端打开命令行窗口并执行 adb wait-for-device shell magisk --remove-modules
长按电源键开机...
如果没有启用 adb 调试
刷入你 原有备份的 boot.img,启用 USB 调试,再刷入 magisk_patched_boot.img,然后运行命令。
这样就算 SystemUI 崩溃,运行这个命令也会删除所有模块。
Tip
先执行再开机
Info
如果你可以刷入 非 root 的 boot.img
并启用 USB 调试,就可以在 root 时修复软重启。
如果在 adb 调试模式之前在引导期间卡住了.....通常这种问题比砖你的 Magisk 模块更严重。
ADB 命令
打开 CMD 并输入 adb shell
切换到目录 cd /data/adb/modules
查找模块 ls -Ral /data/adb/modules
删除 magisk 模块 rm -r /data/adb/modules/module_name
Adb安全验证被禁用时,所有设备都可以获得授权。
TWRP
进TWRP
,删除data/adb/modules
,里面是你的magisk模块。
自定义模块
面具模块的主要作用是修改系统文件和替换系统文件,但是又不是彻底修改,修改之后可以通过关闭或删除模块恢复原样。 下载好的Magisk模块,可以解压,查看文件结构.[25^]
通常模块安装程序是打包成zip文件的Magisk模块,可以在Magisk应用程序或第三方recovery(如TWRP)中进行刷入。安装程序的文件结构与Magisk模块的文件结构相同(请查看上一部分以获取更多信息)。最简单的Magisk模块安装程序只是一个打包为zip文件的Magisk模块,此外还包含以下文件:
update-binary
下载最新的module_installer.sh并重命名/复制为update-binary
updater-script
此文件应仅包含字符串#MAGISK
默认情况下,update-binary
将检查/设置环境,加载使用的脚本,将模块安装程序的zip解压缩到将要安装模块的位置,最后执行一些琐碎的任务和清理工作,这些工作和清理应满足大多数简单模块的需求。
BusyBox2
Magisk附带了功能完整的BusyBox二进制文件(包括完全的SELinux支持)。可执行文件位于/data/adb/magisk/busybox
。
Magisk的 BusyBox 支持运行时切换“ASH独立Shell模式”。这种独立模式意味着,当在BusyBox的灰壳中运行时,每个单独的命令将直接使用 BusyBox 中的 applet,而不管什么被设置为PATH。例如,像ls, rm, chmod这样的命令不会使用 PATH 中的内容(在Android的情况下,默认是/system/bin/ls
, /system/bin/rm
,和/system/bin/chmod
),而是直接调用内部的BusyBox小程序。这可以确保脚本始终运行在可预测的环境中,并且无论运行在哪个 Android 版本上都始终拥有完整的命令套件。要强制命令不使用BusyBox,您必须调用具有完整路径的可执行文件。
在 Magisk 上下文中运行的每个 shell 脚本都将在 BusyBox 的 ash shell
中执行,并启用独立模式。对于与第三方开发人员相关的内容,这包括所有引导脚本和模块安装脚本。
如果你想在 Magisk 以外的地方使用这个“独立模式”功能,有两种方法可以实现:
- 准备环境变量 ASH_STANDALONE 1
例如: ASH_STANDALONE=1 /data/adb/magisk/busybox sh <script>
- 使用命令行选项切换
/data/adb/magisk/busybox sh -o standalone <script>
为了确保所有随后执行的 sh shell 也在独立模式下运行,选项1是首选方法(Magisk 和 Magisk 应用程序内部使用的方法) ,因为环境变量被继承到子进程。
文件结构1
module.zip
│
├── META-INF
│ └── com
│ └── google
│ └── android
│ ├── update-binary <--- 你下载的module_installer.sh
│ └── updater-script <--- 应该只包含字符串"#MAGISK"
│
├── customize.sh <--- (可选,稍后会有更多详细信息)
│ 该脚本将通过update-binary来获取
├── ...
├── ... /* 模块的其余文件 */
│
module.prop
id=Automatic_brick_rescue
name=自动神仙救砖-支持OTA稳定版-等待重启中
version=v210701
versionCode=35
author=奋斗的小青年(原作者 Han|情非得已c)
description=正在等待重启后,测试Magisk开机脚本是否正常执行,来判断自动神仙救砖是否支持您的机型。如果不支持你的机型名称将一直是:自动神仙救砖-等待重启中
updateJson=<url> (optional)
id:Magisk就是通过这个ID来识别模块,所以ID不能冲突。如果是相同的ID,最后刷入的模块则会替换你之前刷入的模块。发布后不应更改。
ID命名
ID的命名是有限制的,很多酷友模块卸载不了,还在模块界面显示问号,很难受。。。就是这个原因导致的。咱看一下magisk的说明:
ID必须匹配这个正则表达式:^[a-zA-Z][a-zA-Z0-9._-]+$。
✗ a module,✗ 1_module,✗ -a-module
不要使用中文及中文字符,不然就会发生卸载不了的情况。如果卸载不了的,也可以手动到/sbin/.magisk/img
文件夹找到相应模块删除。
versionCode 必须是一个 integer 整数,用于比较版本。
updateJson 应该指向一个 URL,该 URL 下载一个 JSON 来提供信息,以便 Magisk 应用程序可以更新模块
Tip
确保使用 UNIX (LF) 换行类型,而不是 Windows (CR+LF) 或者 Macintosh (CR) .
Json格式
{
"version": string,
"versionCode": int,
"zipUrl": url,
"changelog": url
}
Shell脚本(*.sh)
请阅读启动脚本部分,了解post-fs-data.sh
与service.sh
之间的差异。对于大多数模块开发者,service.sh
如果只需运行启动脚本那便足够了。
所有的模块脚本中,使用MODDIR=${0%/*}
来获取模块的基本目录信息
Danger
千万不要在脚本中编码模块目录。
system.prop
该文件的格式与build.prop相同。每行包含[key]=[value]
sepolicy.rule
如果模块需要一些其他的sepolicy补丁,请将这些规则添加到此文件中。 模块安装程序脚本和Magisk的守护进程将确保将此文件复制到magiskinit,它可以读取预初始化的位置,以确保正确插入这些规则。
该文件中的每一行都将被视为策略声明。要详细了解策略声明的格式,请查看magiskpolicy的文档
system文件夹 您希望Magisk为您替换/插入的所有文件都应放在此文件夹中。请查看Magic挂载 部分,以了解Magisk如何挂载文件。
自定义
如果您需要自定义模块安装过程,则可以选择在安装程序中创建一个名为customize.sh
的脚本。这个脚本会在所有文件以默认permissions
和secontext
应用后,由update-binary
调用(不是执行!)。如果您的模块包含基于ABI
的其他文件,或者您需要为某些文件(例如/system/bin
中的文件),设置特殊的permissions/secontext
,这将非常有用。
如果您需要更多的自定义,并且希望自己做所有事情请在customize.sh
中标注SKIPUNZIP=1
以跳过提取操作并应用默认permissions/secontext
。请注意,这样做后,你的customize.sh
将负责自行安装所有内容。
customize.sh
的运行环境
这个脚本将在启用了“独立模式”Magisk的BusyBox ash
shell 中运行。为了方便起见,可以使用以下变量和shell函数:
变量
MAGISK_VER
(string): 当前安装的Magisk的版本字符串 (例如 v20.0)MAGISK_VER_CODE
(int): 当前安装的Magisk的版本代码 (例如 20000)BOOTMODE
(bool): 如果模块当前安装在Magisk Manager中,则为trueMODPATH
(path): 你的模块应该被安装到的路径TMPDIR
(path): 一个你可以临时存储文件的路径ZIPFILE
(path): 模块的安装包(zip)的路径ARCH
(string): 设备的CPU构架。值可以是arm, arm64, x86, or x64IS64BIT
(bool): 如果$ARCH(上方的ARCH变量)为 arm64或x64,则为trueAPI
(int): 设备的API级别(Android版本)(例如 21为Android 5.0)
可用函数
ui_print <msg>
打印(print)<msg>到控制台
避免使用'echo',因为它不会显示在第三方的recovery的控制台中。
abort <msg>
打印错误信息<msg>到控制台并终止安装
避免使用'exit',因为它会跳过终止的清理步骤
set_perm <文件名> <所有者> <用户组> <文件权限> [上下文]
如果 [上下文] 没有设置,则默认为"u:object_r:system_file:s0"
该函数是以下命令的简写:
chown 所有者.用户组 文件名
chmod 权限 文件名
chcon 上下文 文件名
set_perm_recursive <目录> <所有者> <用户组> <目录权限> <文件权限> [上下文]
如果 [上下文] 没有设置,则默认为"u:object_r:system_file:s0"
对于<目录>中的所有文件,它将调用:
set_perm 文件 所有者 用户组 文件权限 上下文
对于<目录>中的所有目录(包括自身),它将调用:
set_perm 目录 所有者 用户组 目录权限 上下文
为了方便起见,还可以在变量名 REPLACE
中声明要替换的文件夹列表。
模块安装程序脚本将提取此变量并创建.replace
文件进行替换。声明示例:
REPLACE="
/system/app/YouTube
/system/app/Bloatware
"
上面的列表将导致创建以下文件: $MODPATH/system/app/YouTube/.replace和$MODPATH/system/app/Bloatware/.replace
Tip
使用Magisk Manager
下载模块时,将使用最新的module_installer.sh
强制替换update-binary
,以确保所有安装程序都使用最新的脚本。不要试图在update-binary
中添加任何自定义逻辑,毫无意义。
由于历史原因,请勿在模块安装程序中添加名为install.sh
的文件。该文件以前曾被使用过,将被区别对待。
不要在customize.sh
末尾使用exit
。模块安装程序将会自行完成。
模块技巧
删除文件
如何自动删除文件?实际使文件删除很复杂(可能,不值得付出努力)。用空文件替换它应该已经足够了!创建一个具有相同名称的空文件,并将其放置在模块内的相同路径中,它将用空文件替换你的目标文件。
删除文件夹
与上述相同,实际上使文件夹删除是不值得的。用一个空文件夹替换它应该已经足够了!对于模块开发人员来说,一个方便的技巧是将要删除的文件夹添加到customize.sh中的REPLACE列表中。
如果您的模块没有提供相应的文件夹,它将创建一个空文件夹,并自动将.replace添加到该空文件夹中,以便虚拟文件夹可以正确替换/system中的一个文件夹。
启动脚本
在Magisk中,您可以以两种不同的模式运行启动脚本: post-fs-data和late_start service模式
- post-fs-data 模式
该模式以阻塞方式(BLOCKING)
运行。启动会直到所有进程加载完毕后或等待10秒后才继续进行,脚本在安装任何模块之前运行。
允许模块开发者在安装模块之前动态调整其模块。
该模式在Zygote启动前执行(意味着所有进程已经加载完毕)
Tip
仅在必要时在此模式下运行脚本!
- late_start service 模式
该模式以非阻塞方式(NON-BLOCKING)
运行。此模式下Magisk将会与其他进程并行处理。
推荐在该模式下运行大多数的脚本.
在Magisk中,还有两种脚本: 通用脚本
和模块脚本
.
通用脚本特性
- 脚本会被放在
/data/adb/post-fs-data.d或/data/adb/service.d
- 脚本仅在脚本可执行时执行(执行权限,
chmod +x script.sh
) - 脚本在
post-fs-data.d
中以post-fs-data
模式运行,在service.d
中以late_start service
模式运行。 - 模块不应该添加一般脚本,因为它违反封装规则
模块脚本特性
- 脚本放置在模块的文件夹中
- 仅在启用了模块的情况下执行
- post-fs-data.sh在post-fs-data 模式下运行,service.sh在late_start service 模式下运行。
- 需要启动脚本的模块应仅使用模块脚本而不是常规脚本
这些脚本将在启用了“独立模式”Magisk的BusyBox ash shell中运行.
根目录覆盖系统
由于/
在system-as-root
设备上是只读的, 因此Magisk提供了一个覆盖系统,使开发人员可以替换根目录中的文件或添加新的*.rc
脚本。此功能主要是为自定义内核开发人员设计的。
覆盖文件应放在boot镜像ramdisk的overlay.d
文件夹中并遵循以下规则:
overlay.d
中所有的*.rc
将在init.rc之后读取并链接- 现有文件可以被位于相同相对路径的文件替换
- 与不存在的文件对应的文件将被忽略
- 为了在自定义
*.rc
脚本中引用其他文件, 请在overlay.d/sbin
中添加其他文件。上面的3条规则不适用于此特定文件夹中的所有内容,因为它们将被直接复制到 Magisk 的内部tmpfs目录(该目录始终位于/sbin
)。
由于Android 11中的更改,不再保证/sbin
文件夹存在。这种情况下,Magisk会随机生成tmpfs
文件夹。在你的*.rc
脚本中所有的${MAGISKTMP}
会在magiskinit
注入到init.rc
中时,被Magisk tmpfs
文件夹替换。
这也可以在Android 11之前的设备上使用,因为在这种情况下${MAGISKTMP}
将简单地被替换为/sbin
,因此最佳实践是在引用其他文件时,不要在*.rc脚本中编码/sbin
。
下面是一个如何使用自定义*.rc
脚本设置overlay.d
的示例:
ramdisk
│
├── overlay.d
│ ├── sbin
│ │ ├── libfoo.ko <--- 这两个文件将被复制
│ │ └── myscript.sh <--- 到Magisk的tmpfs目录
│ ├── custom.rc <--- 该文件将被注入到init.rc中
│ ├── res
│ │ └── random.png <--- 该文件将替换/res/random.png
│ └── new_file <--- 该文件将被忽略,因为
│ /new_file不存在
├── res
│ └── random.png <--- 该文件将被替换为
│ /overlay.d/res/random.png
├── ...
├── ... /* 其余的initramfs文件 */
│
这是一个示例custom.rc
配置
# 使用${MAGISKTMP}引用Magisk的tmpfs目录
on early-init
setprop sys.example.foo bar
insmod ${MAGISKTMP}/libfoo.ko
start myservice
service myservice ${MAGISKTMP}/myscript.sh
oneshot
特典:ClashForMagisk
刷入此包即可:Clash养老版,自带说明
创建日期: August 19, 2022 11:27:51