MagiskDocument

Magisk Delta 内部文档

本文档介绍了适用于安卓设备的无系统 root 解决方案 Magisk Delta 的部分高级功能。Magisk Delta 允许你在不改变原始启动映像的情况下修改设备,并提供一个统一的界面来管理模块、root 访问权限等。

早期挂载

有些文件需要在启动过程中尽早挂载,即在执行“启动”进程之前。Magisk Delta 提供了一种在“预启动”阶段使用 early-mount.d 目录挂载文件的方法。

EARLYMOUNTV2=false
if grep "$(magisk --path)/.magisk/early-mount.d" /proc/mounts | grep -q '^early-mount.d/v2'; then
    EARLYMOUNTV2=true
fi
$(magisk --path)/.magisk/early-mount.d

常规挂载

(*) 使用 persistmetadata 进行早期挂载时要小心,因为这些分区的大小非常有限。填满它们可能会导致设备无法启动。

模块挂载

::: tip 早期启动挂载只支持简单挂载,即可以替换文件,但不能添加新文件、文件夹或替换文件夹。 :::

init.rc 注入

常规注入

如果您想在不重新打包启动映像的情况下将自定义 *.rc 脚本注入设备,Magisk Delta 提供了一种无系统地实现这一目标的方法。您可以使用 initrc.d 目录来存储自定义脚本,Magisk Delta 会在每次启动时将它们注入到 init.rc 中。

下面是一个自定义脚本的示例,名为 custom.rc,可以与 initrc.d 一起使用:

# 使用 ${MAGISKTMP} 引用 Magisk 的 tmpfs 目录

on early-init
    setprop sys.example.foo bar
    insmod ${MAGISKTMP}/.magisk/early-mount.d/libfoo.ko
    start myservice

service myservice ${MAGISKTMP}/.magisk/early-mount.d/myscript.sh
    oneshot

模块注入

自 Magisk Delta v26.0+ 使用 early-mount.d/v2 后,您也可以将 initrc.d 文件放到 /data/adb/modules/<module_id>/early-mount/initrc.d 中。

删除文件和文件夹

使用 Magisk 模块是修改系统分区的简便方法,无需对系统分区进行实际修改,而且修改非常容易。Magisk 模块可以替换或添加任何文件或文件夹到系统中。但仍不允许使用 Magisk 模块删除文件。

在 Magisk 文档中:

实际删除文件很复杂(有可能,但不值得这么做)。用一个假文件替换它就足够了

要真正删除文件夹非常复杂(有可能,但不值得费力)。用一个空文件夹替换就足够了。将文件夹添加到模块模板中 “config.sh” 的替换列表中,它将用一个空文件夹替换该文件夹

在某些情况下,仅将文件或文件夹替换为空文件或文件夹是不够的,还可能导致问题,因为某些修改需要文件消失才能生效。因此,Magisk Delta 为模块添加了删除支持:在模块目录的相应位置创建指向 /xxxxx 的损坏的符号链接

以创建符号链接 /data/adb/modules/mymodule_id/system/vendor/etc/thermal-engine-normal.conf 为例,目标 /vendor/etc/thermal-engine-normal.conf 将被忽略并消失。

ln -s "/xxxxx" /data/adb/modules/mymodule_id/system/vendor/etc/thermal-engine-normal.conf