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、一加、小米部分机型等),这是最彻底的解法:
- 刷 Magisk 或 KernelSU
- 在 root 管理器里给 Shizuku 和 Bloker 都授权
- Shizuku 会通过 root 权限启动服务,Bloker 就能正常调用了
- 重启后不需要重新配对,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 报错时,反复点同一个组件的开关没有任何意义——权限不够就是不够,点一万次还是报一样的错。先解决权限通道的问题,再回来操作。