RikkaApps/Shizuku-API
开发工具让 Android 应用以 ADB shell 或 root 身份运行自身 Java/JNI 代码,适合需要特权能力的 Android 开发者。
项目介绍
Shizuku-API 是 Shizuku 与 Sui 的客户端库和开发者指南。它让 Android 应用能够以 ADB shell(UID 2000)或 root(UID 0)的身份执行自己的 Java 或 JNI 代码,而不只限于应用自身的沙箱权限。
项目提供两种机制:
- 远程 Binder 调用:通过
rikka.shizuku.ShizukuBinderWrapper把 Binder 调用转发给以特权运行的 Shizuku 服务。用法简单,但能做的事情受限于 Binder 调用,适合较小的功能。 - UserService:类似 Bound Service,在独立进程中以 root 或 shell 身份运行。可以执行任意 Java/原生代码,且不受非 SDK API 限制;但该进程不是正常的 Android 应用进程,
Context的许多 API(如registerReceiver、getContentResolver)无法使用。
目标用户是需要执行包管理、系统设置、shell 命令等特权操作的 Android 开发者,并且愿意查阅 Android 框架源码。指南明确说明,使用这套 API 更接近框架或系统应用开发,普通应用开发经验可能不够,熟悉 cs.android.com 和隐藏 API 行为会很有帮助。
快速使用
前提:Android 6.0+,设备已安装 Shizuku 或 Sui,项目使用 Android Gradle。非 root 设备上,Shizuku 每次开机后需通过 adb 手动启动(Android 11+ 可用无线调试);root 设备上 Sui 是 Magisk 模块,需要解锁 bootloader。用户可从官方下载页获取 Shizuku,或从 Magisk、Sui 仓库安装 Sui。
- 添加依赖,把占位符替换为 Maven Central 上的当前版本:
def shizuku_version = "<version from Maven Central>"
implementation "dev.rikka.shizuku:api:$shizuku_version"
// 仅在支持 Shizuku(而不只是 Sui)时需要
implementation "dev.rikka.shizuku:provider:$shizuku_version"
- 在
AndroidManifest.xml中注册ShizukuProvider(Shizuku 需要;从 v12.1.0 起它也会自动初始化 Sui):
<provider
android:name="rikka.shizuku.ShizukuProvider"
android:authorities="${applicationId}.shizuku"
android:multiprocess="false"
android:enabled="true"
android:exported="true"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
-
通过
Shizuku.addBinderReceivedListener()和Shizuku.addBinderDeadListener()监听 binder,只在 binder 存活时调用Shizuku方法,否则会抛出IllegalStateException。使用 Sui 时,先调用Sui.init(packageName);每个进程只需调用一次,且可在主线程调用。 -
按 Android 运行时权限的方式申请权限:
Shizuku.checkSelfPermission()、Shizuku.requestPermission(code)、Shizuku.addRequestPermissionResultListener()。不支持 v11 之前的 Shizuku。 -
开始使用特权。简单场景用
ShizukuBinderWrapper发起 Binder 调用。要运行自己的代码,实现继承 AIDLStub的类,并通过Shizuku.bindUserService(UserServiceArgs, ServiceConnection)启动;用unbindUserService停止,同时实现 destroy transaction(16777115,在 aidl 中为16777114)做清理并调用System.exit(),因为进程不会被自动杀死。
仓库内有完整的示例项目。调试 UserService 时,在 Android Studio 的 Run/Debug configurations 中勾选 "Always install with package manager",确保运行的是最新代码。
使用约束
- 特权来源不同:
Shizuku#getUid()在 root 下返回0,在 ADB 下返回2000。ADB 能做什么取决于授予 Shell 的 Android 权限,且随 Android 版本变化;shell 也无法访问其他应用的数据目录,例如/data/user/0/<package>。 - UserService 进程不是合法的 Android 应用进程;即使拿到
Context,registerReceiver、getContentResolver等 API 也无法工作。 - 多进程应用必须在每个使用该 API 的进程中调用
ShizukuProvider.enableMultiProcessSupport(),并在每个这样的进程中调用Sui.init()。 - 远程 Binder 调用隐藏 API 时,应用进程仍需绕过限制,可使用 AndroidHiddenApiBypass;HiddenApiRefinePlugin 可辅助编译期的隐藏 API 访问。
- 版本要求:从 13.1.0 起,min API 为 23 的应用必须启用库脱糖;12.1.0 起不再支持 v11 之前的 Shizuku;应显式设置
UserServiceArgs.tag,因为 ProGuard/R8 会重命名类名,按类名匹配不稳定。 Shizuku#newProcess将被移除,应迁移到 UserService。- 项目采用 MIT 许可证。API 本身不提供特权,用户必须另行安装 Shizuku 或 Sui。
HotRepo 点评
在 2026-11-01 的 Java 日榜上,Shizuku-API 记录到第 6 名,当天新增 6 Star,总计 2,724 Star、1,297 Fork。Fork 数与 Star 数接近 1:2,比较少见,像是不少开发者把项目克隆下来研究或改造,而不只是点 Star,这与一个以示例和指南为主要入口的库相符。这条快照只反映当天情况,不足以判断长期趋势。项目的实际门槛不在安装,而在理解 Android 特权语义;指南本身也提示,普通应用开发经验可能不够用。
本文由 AI 根据项目 README 生成,更新于 ,以项目官方文档为准。