Exec Activity 接口 - 让 Runner 被其他应用远程调用
什么是 Exec Activity
Runner 不止是你手动打开才能用的工具——它暴露了一个名为 Exec 的 Activity,任何其他 App 都可以通过发送 Intent + 命令字符串,让 Runner 在后台默默执行。这是 Runner 自动化能力的核心。
接口规则很简单:
- Activity 名称:
com.shizuku.uninstaller/.Exec(包名 +/.Exec) - 传递方式:Intent extra
content="这里填要执行的命令" - 结果:Runner 执行后弹出通知或通过返回 Intent 把执行结果回传
手动测试
在电脑上用 adb 可以直接测试这个接口:
adb shell am start -n com.shizuku.uninstaller/.Exec --es content "echo hello-runner"
执行后你应该在手机上看到 Runner 弹出通知或执行结果弹窗,命令 echo hello-runner 的输出应该能在通知里看到。
在其他 App 里调用
Java/Kotlin 方式(Android 开发者):
val intent = Intent()
intent.component = ComponentName("com.shizuku.uninstaller", "com.shizuku.uninstaller.Exec")
intent.putExtra("content", "pm disable-user --user 0 com.sina.weibo")
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
如果需要等待执行结果,可以用 startActivityForResult(旧版)或 Activity Result API(新版),Runner 会在执行完毕后回传执行结果和返回码。
返回值解读
Runner 执行命令后可能回传以下信息:
| 字段 | 说明 |
|---|---|
| resultCode | Android Activity 标准结果码(RESULT_OK = -1 表示执行成功) |
| 命令返回值 | shell 命令本身的退出码(0 = 成功,非 0 = 失败) |
| 输出文本 | 命令的 stdout 输出(可能被截断) |
| 权限信息 | 当前命令是以 shell 还是 root 身份执行 |
安全注意
Exec 接口是对所有 App 开放的——只要你能启动 Runner,就能让它执行命令。这方便了自动化,但也意味着:
- 只在你信任的自动化场景里用——比如你自己写的 Tasker 任务、自己开发的 App
- 不要随便给第三方 App 这个能力——某 App 如果能调用 Runner 的 Exec 接口,就相当于拿到了 shell/root 权限
- Runner 本身没有额外权限检查(任何应用都能启动 Exec Activity),所以安全性完全靠谁来发 Intent这层保证
常见问题
调用后没反应:
- 检查包名是否正确(
com.shizuku.uninstaller) - 检查 Exec Activity 名称是否正确(
/.Exec,大小写敏感) - 检查 Shizuku 服务是否已启动(Runner 执行命令需要 Shizuku 的 Binder 通道)
- 部分定制系统拦截了跨应用 Activity 启动,需要在权限设置里手动开放
Exec Activity 不存在:
- 旧版本 Runner 可能没有暴露 Exec 接口,升级到 v15+ 试试
- 确认安装的是社区重构版,不是其他同名应用