☰
如何把Shizuku API集成到你的App:从零实现高权限系统调用
2026/10/12 21:09:56 网站建设 项目流程

【免费下载链接】shevery

Shevery - Modernized Android manager with Jetpack Compose, Material 3, and compatibility enhancements.

项目地址:https://gitcode.com/gh_mirrors/sh/shevery
点击查看免费下载

Shevery(基于 Shizuku 的现代化管理器)提供了完整可用的Shizuku API:让你的 App 免 Root 即可通过 ADB/Root 身份调用高权限系统接口。本文从原理到实战,带你从零完成 Shizuku API 集成,实现系统级调用。

一、为什么需要 Shizuku API?

在 Android 上执行高权限操作(比如静默安装 APK、读取系统属性、管理用户),传统做法是在sushell 里敲命令。但这有几个致命缺点:

  1. 🐢极慢:每执行一条命令都要创建新进程;
  2. 📝不可靠:需要解析命令输出的文本;
  3. 🔒能力受限:只能用系统命令能做的事;
  4. 📱强依赖 Root:即使 ADB 权限已经够用,也必须 Root。

Shizuku API 走的是完全不同的路线:它先以 root 或 ADB 身份启动一个 Shizuku server 进程,再把一个binder句柄发给你的 App。之后你的 App 发起的系统调用会被 Shizuku 作为"中间人"转发给 system_server,并以高权限身份执行,结果原路返回。对 App 来说,调用方式和普通系统 API 几乎一模一样。

整个流程可以概括为:

你的 App ──(binder 请求)──> Shizuku server(root/shell) ──(转发)──> system_server <──(结果回传)─────────────────────────────────────────┘

核心实现可以看 Shizuku.java(App 侧入口)和 ShizukuService.java(服务端转发逻辑)。

二、准备工作:用 Shevery 启动 Shizuku 服务

Shizuku API 要求用户设备上先安装并启动 Shizuku 服务。Shevery 就是为此设计的现代化管理器,相比原版 Shizuku Manager 它还额外提供:

  • 📶无线调试启动:Android 11+ 无需电脑,直接在手机上一键启动;
  • 🔑Device Owner(Dhizuku)集成:通过设备所有者实现免重启自启动;
  • 🧩ADB Modules 管理、🤖Comput AI 控制台、生物识别保护等增强功能。

提示:非 Root 设备每次重启后需要重新启动 Shizuku。引导用户在设置里启用 Shevery 的"无线调试"或"OTG"启动方式,可以显著降低使用门槛。

三、第一步:添加依赖与声明 ShizukuProvider

1. 添加 Gradle 依赖

def shizuku_version = '13.1.5' implementation "dev.rikka.shizuku:api:$shizuku_version" // 支持 Shizuku 时必须加 provider implementation "dev.rikka.shizuku:provider:$shizuku_version"

2. 在 AndroidManifest 中声明 ShizukuProvider

Shizuku server 正是通过这个ContentProvider把 binder 送进你的 App 进程。完整声明见 DemoActivity 示例清单:

<provider android:name="rikka.shizuku.ShizukuProvider" android:authorities="${applicationId}.shizuku" android:enabled="true" android:exported="true" android:multiprocess="false" android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />

三个关键属性(原因见 ShizukuProvider.java 的类注释):

属性要求原因
exported必须trueShizuku server 运行在 ADB 下,需要跨进程访问
multiprocess必须falseShizuku server 只在 App 启动时获取 uid
permissionINTERACT_ACROSS_USERS_FULL防止普通 App 仿冒,只有 Shell/Root 能访问

如果是多进程 App,请在Application的静态块中调用ShizukuProvider.enableMultiProcessSupport(),参考 DemoApplication.java。

四、第二步:监听 Binder 生命周期

在 binder 存活期间才能调用Shizuku的方法,否则会抛出IllegalStateException。标准做法是注册两个监听器:

Shizuku.addBinderReceivedListenerSticky(() -> ui("已收到 Binder,可以调用 API")); Shizuku.addBinderDeadListener(() -> ui("Binder 已断开,等待 Shizuku 重启"));

建议在onCreate注册、onDestroy移除,完整写法见 DemoActivity.java。

五、第三步:请求 Shizuku 权限

Shizuku 的权限模型与 Android 运行时权限几乎一致,三步走:

if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) { // 已授权,直接调用 } else if (Shizuku.shouldShowRequestPermissionRationale()) { // 用户勾选了"不再询问" } else { Shizuku.requestPermission(requestCode); // 触发系统弹窗 }

同时通过Shizuku.addRequestPermissionResultListener()接收授权结果。完整可运行的示例就在 DemoActivity.java 的 checkPermission 方法。

六、第四步:调用高权限系统接口(核心实战)

这是集成 Shizuku API 最精华的部分。只需两样东西:

  • ShizukuBinderWrapper:把普通系统 binder 的调用转发给 Shizuku 代为执行,见 ShizukuBinderWrapper.java;
  • SystemServiceHelper.getSystemService():获取系统服务的 binder,见 SystemServiceHelper.java。

以静默安装 APK(需要INSTALL_PACKAGES权限)为例,核心调用只有一行包装:

IPackageInstaller pi = ShizukuSystemServerApi.PackageManager_getPackageInstaller(); // 把返回的 binder 包一层,即变成"高权限版" IPackageInstallerSession session = IPackageInstallerSession.Stub.asInterface( new ShizukuBinderWrapper(pi.openSession(id).asBinder()));

Demo 中还展示了读取系统属性(ShizukuSystemProperties)、管理用户(UserManager_getUsers)等用例,可直接参考 util 目录。

七、进阶:用 UserService 以 root/shell 身份运行自己的代码

如果"转发 binder 调用"不够用,UserService可以直接在一个独立进程中以 root(UID 0)或 shell(UID 2000)身份运行你自己的 Java/JNI 代码,且不受 Hidden API 限制。

三步接入:

  1. 定义 AIDL 接口,如 IUserService.aidl;
  2. 实现服务类(须继承IUserService.Stub,并实现destroy()用于退出进程),参考 UserService.java;
  3. 绑定/解绑:
Shizuku.UserServiceArgs args = new Shizuku.UserServiceArgs( new ComponentName(getPackageName(), UserService.class.getName())) .version(BuildConfig.VERSION_CODE); Shizuku.bindUserService(args, connection); Shizuku.unbindUserService(args, connection, true);

⚠️ UserService 进程不是标准 Android 应用进程,Context#registerReceiver、getContentResolver()等 API 不可用,需要查阅 Android 源码自行处理。

八、高频踩坑清单 🧨

坑点说明与对策
ADB 权限有限ADB(shell)不是 root,能做的受 Shell 权限清单 限制。可用Shizuku.getUid()判断(0=root,2000=ADB),调用前先checkPermission
Android 9+ Hidden API 限制Remote binder 调用发生在你的 App 进程中,访问隐藏接口需借助 AndroidHiddenApiBypass 等方案
Android 8 + ADBshell 缺少registerUidObserver权限,非 Activity 启动的进程可能收不到 binder,建议启动一个透明 Activity 触发
直接 transactRemote 风险不同 Android 版本的 AIDL 可能不一致,优先使用ShizukuBinderWrapper方式
版本兼容UserService需 API ≥ 10,部分特性需 ≥ 12/13,调用前用Shizuku.getVersion()判断

完整官方指南请阅读仓库内的 api/README.md,它是最权威的 Shizuku API 文档。

九、关键源码索引

文件作用
Shizuku.javaApp 侧总入口:binder 管理、权限、transactRemote、UserService
ShizukuBinderWrapper.java高权限 binder 调用包装器
SystemServiceHelper.java获取系统服务 binder 与 transaction code
ShizukuProvider.java接收 Shizuku server 推送 binder 的 Provider
ShizukuService.java服务端:接收 App 请求并转发至 system_server
DemoActivity.java从权限请求到静默安装的完整 Demo
shizuku-connectors.md实验特性:供第三方 Activator 查询启动命令的 API

十、总结:四步完成集成

  1. ✅ 添加dev.rikka.shizuku:api+:provider依赖,声明ShizukuProvider;
  2. ✅ 注册BinderReceived/BinderDead监听,管理连接生命周期;
  3. ✅ 仿照运行时权限流程调用Shizuku.requestPermission();
  4. ✅ 用ShizukuBinderWrapper+SystemServiceHelper转发系统调用,需要更强能力时升级UserService。

按照这套流程,你的 App 就能像调用普通 API 一样,安全、高效地实现高权限系统调用 🚀

【免费下载链接】shevery

Shevery - Modernized Android manager with Jetpack Compose, Material 3, and compatibility enhancements.

项目地址:https://gitcode.com/gh_mirrors/sh/shevery
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询