文章目录
- Shizuku:不 Root 也能调系统 API
- 1、它在解决什么问题
- 2、开发者怎么接入
- 3、需要注意的几个点
- 4、适合什么场景
Shizuku:不 Root 也能调系统 API
Shizuku 在 GitHub 上拿到了 26,807 Star。
这个工具解决了一个 Android 开发里的老问题:想调系统级 API,要么要求 Root 权限,要么自己写 su 命令去拼。两种方式都不省心。
1、它在解决什么问题
Android 应用想调系统 API,走的是 Binder IPC 机制。应用进程拿到系统服务的 Binder,就能和 PackageManagerService 这类服务通信。框架帮你封装好了权限检查,正常情况下没什么问题。
但如果你需要的权限超出了普通应用的范围,事情就麻烦了。最常见的方式是通过 su shell 执行命令,比如用pm enable/disable去启停组件。
这种方式的毛病很明显:
- 每次调用都要创建新进程,速度慢
- 需要解析命令行文本输出,容易出错
- 能做的事受限于可用命令
- ADB 本身有足够权限时,应用仍然要求 Root
Shizuku 换了一条路。它让用户先以 Root 或 ADB 身份启动一个后台进程(Shizuku Server),然后把这个进程的 Binder 交给应用。应用发请求给 Shizuku Server,Server 再转发给系统服务,结果原路返回。
对应用来说,调用方式和直接用系统 API 几乎没有区别。
2、开发者怎么接入
Shizuku 提供了一套 API,接入方式和其他 Android 库差别不大。核心类是rikka.shizuku.server.ShizukuService里的transactRemote方法,以及moe.shizuku.api.ShizukuBinderWrapper。
从 pre-v11 版本迁移的话,已有应用仍然能正常运行,官方也提供了迁移指南。
3、需要注意的几个点
ADB 权限在不同 Android 版本上不一样。调用 API 之前可以用ShizukuService#getUid检查当前是 Root 还是 ADB 模式,用ShizukuService#checkPermission确认权限是否够用。
Android 9 开始限制了隐藏 API 的访问,普通应用需要用额外手段绕过,比如配合 AndroidHiddenApiBypass 这类库。
Android 8.0 上 ADB 缺少registerUidObserver权限。如果你的进程不是由 Activity 启动的,建议通过启动一个透明 Activity 来触发 Binder 的发送。
直接使用transactRemote时要注意,不同 Android 版本的 API 可能有差异。android.app.IActivityManager在 API 26 及以上才有 AIDL 形式,IActivityManager$Stub也只在 API 26 存在。
4、适合什么场景
需要调用系统 API 但不想依赖 Root 的应用,比如管理组件启停、读取系统设置、操作应用权限。对开发者来说,Shizuku 把权限提升这一层封装好了,接入成本低,运行时不需要用户每次都授权 Root。
如果你在做 Android 工具类应用,又希望兼容非 Root 设备,Shizuku 是目前比较成熟的方案。
Android 工具类应用,又希望兼容非 Root 设备,Shizuku 是目前比较成熟的方案。