在开发需要系统级权限的 Android 应用时,开发者常通过 su 启动 root shell 并执行命令行指令。例如,使用 pm enable 或 pm disable 来启用/禁用组件。
这种方式存在明显缺陷:
- 性能低下:每次调用需创建新进程,开销大;
- 可靠性差:依赖文本解析命令输出,极易出错;
- 功能受限:仅限于已有 shell 命令支持的操作;
- 权限门槛高:即使 ADB 已具备足够权限,应用仍需 root。
Shizuku 提出了一种更高效、更稳定、更接近原生开发体验的替代方案。
核心思想:绕过 shell,直连系统服务
要理解 Shizuku 的优势,先回顾标准系统 API 的工作原理。
以获取已安装应用列表为例,开发者通常调用 PackageManager#getInstalledPackages()。这背后是一次 进程间通信(IPC):应用进程向系统服务(如 PackageManagerService)发起 Binder 调用,系统根据调用者的 UID 检查权限后返回结果。
关键在于:谁能持有系统服务的 Binder 引用,谁就能调用其接口。
Shizuku 的做法是:
- 引导用户以 root 或 ADB shell (UID 2000) 身份启动一个独立的 Shizuku 服务进程;
- 当应用启动时,Shizuku 服务会将自身的 Binder 发送给该应用;
- 应用通过
ShizukuBinderWrapper将原本发往系统服务的 Binder 调用,转发给 Shizuku 服务; - Shizuku 服务以 root/ADB 身份执行该调用,并将结果返回给应用。
整个过程对应用透明,使用方式几乎与直接调用系统 API 一致,但权限提升至 root 或 shell 级别。
实现细节可参考:
- 服务端:
rikka.shizuku.server.ShizukuService#transactRemote- 客户端:
rikka.shizuku.ShizukuBinderWrapper
用户指南
- 官网与下载:https://shizuku.rikka.app/
- 支持设备:Android 6.0+
- 非 root 设备:通过 ADB 启动(Android 11+ 支持无线调试,无需电脑)
- root 设备:可直接运行,或使用 Magisk 模块 Sui(更稳定)
开发者接入指南
1. 集成 Shizuku API
implementation "dev.rikka.shizuku:api:<version>"
implementation "dev.rikka.shizuku:provider:<version>"
在 AndroidManifest.xml 中声明 Provider:
<provider
android:name="rikka.shizuku.ShizukuProvider"
android:authorities="${applicationId}.shizuku"
android:exported="true"
android:enabled="true"
android:multiprocess="false"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
2. 权限申请(类似运行时权限)
if (Shizuku.checkSelfPermission() == PackageManager.PERMISSION_GRANTED) {
// 已授权,可调用 API
} else {
Shizuku.requestPermission(requestCode);
}
需监听授权结果:
Shizuku.addRequestPermissionResultListener(listener);
注意:Shizuku v11+ 已移除对旧版本的支持。建议检查
Shizuku.isPreV11()并提示用户升级。
3. 调用系统 API 示例
private static final IPackageManager PACKAGE_MANAGER = IPackageManager.Stub.asInterface(
new ShizukuBinderWrapper(SystemServiceHelper.getSystemService("package"))
);
public static void grantRuntimePermission(String pkg, String perm, int userId) {
try {
PACKAGE_MANAGER.grantRuntimePermission(pkg, perm, userId);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
重要注意事项
ADB 权限有限
- ADB(UID 2000)并非 root(UID 0),其权限由系统授予的 Android 权限清单决定;
- 例如:ADB 无法访问
/data/user/0/<package>等应用私有目录; - 可通过
Shizuku.getUid()判断当前权限级别(0 = root,2000 = ADB); - 使用前建议通过
Shizuku.checkPermission()验证是否具备所需能力。
隐藏 API 限制(Android 9+)
从 Android 9 起,非 SDK 接口调用受到限制。若需调用隐藏 API,推荐配合以下方案:
- AndroidHiddenApiBypass
- 或使用 Shizuku 提供的
HiddenApiRefinePlugin
Android 8.0 的 ADB 限制
在 Android 8.0(API 26)上,ADB 缺少 IActivityManager#registerUidObserver 权限,可能导致非 Activity 启动的进程无法自动收到 Shizuku Binder。
建议:在需要使用 Shizuku 的后台场景中,通过启动一个透明 Activity 触发 Binder 分发。
关于 transactRemote 的直接使用
- 不同 Android 版本的 AIDL 接口和交易码(transaction code)可能不同;
- 手动查找交易码(如
TRANSACTION_getInstalledPackages)易出错; - 强烈推荐使用
ShizukuBinderWrapper,它已处理版本兼容性问题。
开发 Shizuku 本身
构建步骤
git clone --recurse-submodules https://github.com/RikkaApps/Shizuku
cd Shizuku
./gradlew :manager:assembleDebug # 或 assembleRelease
assembleDebug会生成可调试的服务器;- 调试时,请在 Android Studio 中勾选 “Always install with package manager”,确保服务器加载最新代码;
- 可附加调试器到
shizuku_server进程。















