如何用 Magisk 的 magisk --denylist 命令行添加、移除并查询 DenyList 条目

原创2026-09-08 18:19:191,856 阅读

如何用 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 调整之外的兜底手段。
登录后查看全文