如何用 Magisk 的 magisk --denylist 命令行添加、移除并查询 DenyList 条目
如何用 Magisk 的 magisk --denylist 命令行添加、移除并查询 DenyList 条目
如果你已经在 Android 设备上安装了 Magisk,并想通过命令行管理 DenyList 条目——即指定哪些应用(进程)需要被排除在 Magisk 特性之外——magisk --denylist 子命令就是官方提供的 DenyList 配置 CLI。DenyList 是 Zygisk 引入的功能,用于在用户选定的进程中"revert Magisk features"(恢复原生行为)。本文基于 docs/tools.md 中记载的用法,覆盖添加(add)、移除(rm)、查询(ls)以及开关强制启用(enable / disable / status)三类操作,并给出每一步的输出与返回码判断方式。
准备工作
执行这些命令的前提条件(均可由 docs/install.md 与 docs/tools.md 确认):
- 设备已按官方流程完成 Magisk 安装并正常引导,
magisk二进制位于 Magisk 的 tmpfs 挂载路径下(可用magisk --path查看该路径;若该路径在PATH中,可直接调用magisk)。 - 命令需要以 root 身份执行:通过
adb shell提权后的环境,或设备上的终端应用。docs/faq.md 中给出的常见做法即是连接 PC 后进入 ADB shell 执行magisk系列命令。 - 所有
--denylist请求最终都会发送给 Magisk 守护进程处理,因此 daemon 必须已随系统启动并正常运行(可用magisk -v/magisk -V确认 daemon 版本)。
下面的命令中,PKG 表示目标应用的包名,PROC 为可选参数、表示进程名。二者都是命令语法中的参数位置,请替换为你实际要管理的包名与进程名;本文不虚构具体示例值。
命令总览:七个 action
magisk --denylist 的完整用法如下(引自 docs/tools.md 的 magisk 章节):
Usage: magisk --denylist [action [arguments...] ]
Actions:
status Return the enforcement status
enable Enable denylist enforcement
disable Disable denylist enforcement
add PKG [PROC] Add a new target to the denylist
rm PKG [PROC] Remove target(s) from the denylist
ls Print the current denylist
exec CMDs... Execute commands in isolated mount
namespace and do all unmounts
对应实现见 native/src/core/deny/cli.cpp:不带参数调用 magisk --denylist 会打印上述 usage 并以退出码 1 退出,可作为命令语法是否正确的判断依据。
添加条目:magisk --denylist add
添加一条 DenyList 目标:
magisk --denylist add PKG [PROC]
PKG是必填的包名;PROC可选,用于进一步指定进程。rm同理:magisk --denylist rm PKG [PROC],用于把目标从 DenyList 中移除(实现说明见 cli.cpp 中DenyRequest::REMOVE分支,与add使用相同的"包名 + 可选进程名"两参数形式)。
关于结果判断,add / rm 的退出码遵循同一规则(见 cli.cpp 末尾的 return_code):响应为 OK 时退出码为 0,否则非 0。执行后紧跟 echo $?(或直接观察 shell 退出码)即可判断是否成功;非 0 时 stderr 会给出下文"返回值与提示语"一节中对应的具体提示。
查询条目:magisk --denylist ls
查询当前 DenyList 全部内容:
magisk --denylist ls
ls 会逐行打印当前 DenyList 中的每个目标,每条占一行;列表打印完毕即结束(实现见 cli.cpp 中 DenyRequest::LIST 分支)。这是验证 add / rm 是否真正生效的直接方式:添加后执行 ls,确认新目标出现;移除后再次执行 ls,确认目标不再出现。
开关与状态:enable / disable / status
DenyList 条目只是"目标列表",是否需要真正强制执行由 enforcement 状态决定:
magisk --denylist enable # Enable denylist enforcement
magisk --denylist disable # Disable denylist enforcement
magisk --denylist status # Return the enforcement status
status 是判断当前状态的依据,其行为由 cli.cpp 明确给出:
- 当前处于强制启用状态:stderr 输出
Denylist is enforced,退出码为 0; - 当前未启用:stderr 输出
Denylist is not enforced,退出码非 0。
因此 status 的退出码可以直接用于脚本判断(例如 magisk --denylist status && echo "已启用" 只在强制启用时打印)。docs/changes.md 中另有变更记录:新版 Magisk 支持在 Zygisk 关闭时也执行 denylist("Support enforcing denylist when Zygisk is disabled")。
返回值与提示语
add / rm 及状态类操作的成功与否都通过 stderr 提示语加退出码体现。以下为 native/src/core/deny/cli.cpp 中实际打印的提示(原文为英文):
| stderr 提示 | 出现场景 |
|---|---|
Target already exists in denylist |
add 时该目标已在 DenyList 中 |
Target does not exist in denylist |
rm 时该目标不在 DenyList 中 |
Invalid package / process name |
传入的包名或进程名非法 |
The kernel does not support mount namespace |
内核不支持 mount namespace |
Denylist is enforced / Denylist is not enforced |
查询强制启用状态 |
deny: Daemon error |
与 daemon 通信或处理出错,退出码为 1 |
这些提示是"文档/源码中给出的已知现象",不是每条命令的固定输出;只有实际出现的提示才对应相应场景。
在独立 mount namespace 中验证:exec
当 DenyList 生效后,目标进程看到的是卸载 Magisk 挂载后的视图。exec action 可以在不重启的情况下复现这一视角,用于确认 DenyList 的 unmount 效果:
magisk --denylist exec <command>
其定义为"Execute commands in isolated mount namespace and do all unmounts"(在独立 mount namespace 中执行命令并完成全部卸载)。也就是说,exec 后的命令运行在已应用 unmount 的环境里;若你的内核不支持 mount namespace,会收到上表中的 The kernel does not support mount namespace 提示。
已知限制与排查边界
- 所有操作都要求 Magisk daemon 正在运行且可被连接;若提示
deny: Daemon error,说明请求在 daemon 端处理失败,先用magisk -v确认 daemon 是否正常。 ls输出的是目标列表本身,不会打印"某应用已检测不到 root"之类的效果结论;判断条目是否存在以ls为准,判断是否强制启用以status为准。- docs/faq.md 明确指出:Magisk 本身不再负责 root 隐藏("Magisk no longer handles root hiding"),相关能力由社区 Magisk/Zygisk 模块提供;DenyList CLI 管理的是 Magisk 自身的 unmount 目标列表。如果你的需求是"让某个 App 检测不到 root",应转向模块方案,而不是反复调整 DenyList 条目。
rm只会修改 DenyList 条目(数据库中的目标记录),不触碰目标应用的文件或数据;但仍建议操作后用ls复核,避免包名拼写错误导致"移除了一个不存在的目标"(此时会得到Target does not exist in denylist提示)。
下一步
- 需要管理模块时,使用 docs/tools.md 中记载的
magisk --install-module ZIP与magisk --remove-modules。 - 若设备出现模块导致启动循环等问题,docs/faq.md 给出了通过 ADB 执行
magisk --remove-modules的恢复流程,可作为 DenyList 调整之外的兜底手段。