blocker 中文文档 下载 App

SecurityException Shell cannot change component state 报错修法

典型报错与原因

Bloker 在 Shizuku 模式下改组件状态时,如果遇到下面这条报错:

SecurityException: Shell cannot change component state for 'com.xxx.yyy/.SomeComponent' to state 'enabled'

原因很明确:当前 Shizuku 的 shell 权限不够修改这个普通应用的组件状态。

权限等级对比

权限来源能改哪些应用的组件
root 进程所有应用,包括普通应用
Shizuku + shell 权限只能改 Test-Only 标记的应用,改不了普通应用
Shizuku + root 权限所有应用(等同于 root 进程)
应用自身的系统签名只能改自己的组件

Android 在 PackageManagerService 里有硬编码限制——不是 root、不是签名匹配的应用,shell 权限也改不动普通应用的组件。Bloker 的 Shizuku 路线走的是 shell 通道,自然也受这个限制。

三种修法

修法一:给设备 root,让 Shizuku 以 root 启动(最推荐)

如果你的设备支持 root(Pixel、一加、小米部分机型等),这是最彻底的解法:

  1. 刷 Magisk 或 KernelSU
  2. 在 root 管理器里给 Shizuku 和 Bloker 都授权
  3. Shizuku 会通过 root 权限启动服务,Bloker 就能正常调用了
  4. 重启后不需要重新配对,root 授权持久化

修法二:Shizuku 用 adb shell 命令以 root 启动

不通过 Shizuku UI 的无线调试配对,而是连上电脑用 adb:

adb shell su -c "/data/user_de/0/moe.shizuku.privileged.api/start.sh"

这条命令以 root 权限启动 Shizuku 服务,Bloker 就能正常用了。缺点是每次重启后要重新连电脑跑一次。

修法三:接受部分应用改不了

如果以上两种都不适合你的设备(比如某些厂商锁了 bootloader 无法 root),那 Bloker 能改的应用就受限于 shell 权限了——改自己的组件没问题,改 Test-Only 应用也没问题,但改不了其他普通应用。

这时候要么换路线(用 root),要么用其他手段(比如直接卸载广告 SDK 的 APK,但这是更进阶的操作)。

反复点开关没用

遇到 SecurityException 报错时,反复点同一个组件的开关没有任何意义——权限不够就是不够,点一万次还是报一样的错。先解决权限通道的问题,再回来操作。