【免费下载链接】shevery
Shevery - Modernized Android manager with Jetpack Compose, Material 3, and compatibility enhancements.
Shevery(基于 Shizuku 的现代化管理器)提供了完整可用的Shizuku API:让你的 App 免 Root 即可通过 ADB/Root 身份调用高权限系统接口。本文从原理到实战,带你从零完成 Shizuku API 集成,实现系统级调用。
一、为什么需要 Shizuku API?
在 Android 上执行高权限操作(比如静默安装 APK、读取系统属性、管理用户),传统做法是在sushell 里敲命令。但这有几个致命缺点:
- 🐢极慢:每执行一条命令都要创建新进程;
- 📝不可靠:需要解析命令输出的文本;
- 🔒能力受限:只能用系统命令能做的事;
- 📱强依赖 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 | 必须true | Shizuku server 运行在 ADB 下,需要跨进程访问 |
multiprocess | 必须false | Shizuku server 只在 App 启动时获取 uid |
permission | INTERACT_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 限制。
三步接入:
- 定义 AIDL 接口,如 IUserService.aidl;
- 实现服务类(须继承
IUserService.Stub,并实现destroy()用于退出进程),参考 UserService.java; - 绑定/解绑:
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 + ADB | shell 缺少registerUidObserver权限,非 Activity 启动的进程可能收不到 binder,建议启动一个透明 Activity 触发 |
| 直接 transactRemote 风险 | 不同 Android 版本的 AIDL 可能不一致,优先使用ShizukuBinderWrapper方式 |
| 版本兼容 | UserService需 API ≥ 10,部分特性需 ≥ 12/13,调用前用Shizuku.getVersion()判断 |
完整官方指南请阅读仓库内的 api/README.md,它是最权威的 Shizuku API 文档。
九、关键源码索引
| 文件 | 作用 |
|---|---|
| Shizuku.java | App 侧总入口: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 |
十、总结:四步完成集成
- ✅ 添加
dev.rikka.shizuku:api+:provider依赖,声明ShizukuProvider; - ✅ 注册
BinderReceived/BinderDead监听,管理连接生命周期; - ✅ 仿照运行时权限流程调用
Shizuku.requestPermission(); - ✅ 用
ShizukuBinderWrapper+SystemServiceHelper转发系统调用,需要更强能力时升级UserService。
按照这套流程,你的 App 就能像调用普通 API 一样,安全、高效地实现高权限系统调用 🚀
【免费下载链接】shevery
Shevery - Modernized Android manager with Jetpack Compose, Material 3, and compatibility enhancements.
相关推荐
Shizuku API实战指南:如何为Android应用添加系统权限功能
Shizuku API实战指南:如何为Android应用添加系统权限功能 Shizuku是一个革命性的Android框架,它允许普通应用在非root设备上直接使
文档知识库如何快速设置Shizuku:从ADB到系统权限的完整教程
如何快速设置Shizuku:从ADB到系统权限的完整教程 想要解锁Android设备的更多可能性吗?Shizuku作为一款强大的Android系统权限管理工具,
文档知识库如何快速把Stellar API集成到你的App:从添加依赖到执行特权命令的完整教程
如何快速把Stellar API集成到你的App:从添加依赖到执行特权命令的完整教程 Stellar 是一个基于 Shizuku 深度定制的特权 API 框架
移动开发认证鉴权
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考