文章目录Shizuku不 Root 也能调系统 API1、它在解决什么问题2、开发者怎么接入3、需要注意的几个点4、适合什么场景Shizuku不 Root 也能调系统 APIShizuku 在 GitHub 上拿到了 26,807 Star。这个工具解决了一个 Android 开发里的老问题想调系统级 API要么要求 Root 权限要么自己写 su 命令去拼。两种方式都不省心。1、它在解决什么问题Android 应用想调系统 API走的是 Binder IPC 机制。应用进程拿到系统服务的 Binder就能和 PackageManagerService 这类服务通信。框架帮你封装好了权限检查正常情况下没什么问题。但如果你需要的权限超出了普通应用的范围事情就麻烦了。最常见的方式是通过 su shell 执行命令比如用pm enable/disable去启停组件。这种方式的毛病很明显每次调用都要创建新进程速度慢需要解析命令行文本输出容易出错能做的事受限于可用命令ADB 本身有足够权限时应用仍然要求 RootShizuku 换了一条路。它让用户先以 Root 或 ADB 身份启动一个后台进程Shizuku Server然后把这个进程的 Binder 交给应用。应用发请求给 Shizuku ServerServer 再转发给系统服务结果原路返回。对应用来说调用方式和直接用系统 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 是目前比较成熟的方案。