背景
在开发需要 root 权限的应用时,最常用的方法是在 su shell 中运行一些命令。例如,有一个应用使用该pm enable/disable
命令来启用/禁用组件。
这种方法有很大的缺点:
- 极其缓慢(创建多个进程)
- 需要处理文本(超级不可靠)
- 可能性仅限于可用的命令
- 即使 ADB 具有足够的权限,应用程序也需要 root 权限才能运行
Shizuku 采用了完全不同的方式。请参阅下文的详细说明。
用户指南及下载
Shizuku 如何工作?
首先,我们需要讨论一下应用程序如何使用系统 API。例如,如果应用程序想要获取已安装的应用程序,我们都知道应该使用PackageManager#getInstalledPackages()
。这实际上是应用程序进程和系统服务器进程之间的进程间通信 (IPC) 过程,只是 Android 框架为我们完成了内部工作。
Android 用于binder
执行这种类型的 IPC。Binder
允许服务器端了解客户端的 uid 和 pid,以便系统服务器可以检查应用程序是否有权限执行该操作。
通常,如果存在一个“管理器”(例如)供应用使用,那么系统服务器进程中PackageManager
就应该有一个“服务”(例如)。我们可以简单地理解,如果应用持有该“服务”的 ,它就可以与该“服务”进行通信。应用进程在启动时会收到系统服务的绑定器。PackageManagerService
binder
Shizuku 会引导用户先用 root 或 ADB 运行一个进程,即 Shizuku server。应用启动时,binder
也会向应用发送 to Shizuku server 的消息。
Shizuku 提供的最重要的功能就像一个中间人,负责接收来自应用程序的请求,将其发送到系统服务器,并返回结果。您可以transactRemote
在rikka.shizuku.server.ShizukuService
类中查看该方法,并moe.shizuku.api.ShizukuBinderWrapper
在类中查看详细信息。
这样,我们达到了目标,能够以更高的权限使用系统 API。对于应用来说,这几乎与直接使用系统 API 完全相同。
开发人员指南
API 和示例
https://github.com/RikkaApps/Shizuku-API
从 v11 之前的版本迁移
当然,现有的应用程序仍然有效。
注意力
-
ADB权限受限
ADB 的权限有限,且在不同系统版本上有所差异。您可以在此处查看授予 ADB 的权限。
在调用 API 之前,您可以使用
ShizukuService#getUid
检查 Shizuku 是否正在运行用户 ADB,或者使用ShizukuService#checkPermission
检查服务器是否有足够的权限。 -
Android 9 的隐藏 API 限制
从 Android 9 开始,普通应用使用隐藏 API 的功能将受到限制。请使用其他方法(例如https://github.com/LSPosed/AndroidHiddenApiBypass)。
-
Android 8.0 和 ADB
目前,Shizuku 服务获取应用进程的方式是结合
IActivityManager#registerProcessObserver
和IActivityManager#registerUidObserver
(26+),以确保应用启动时会发送应用进程。然而,在 API 26 上,ADB 缺少使用 的权限registerUidObserver
,因此如果您需要在可能并非由 Activity 启动的进程中使用 Shizuku,建议通过启动透明 Activity 来触发发送 Binder。 -
直接使用
transactRemote
需要注意-
该 API 在不同的 Android 版本下可能有所不同,请务必仔细检查。此外,
android.app.IActivityManager
在 API 26 及更高版本中具有 aidl 形式,并且android.app.IActivityManager$Stub
仅在 API 26 上存在。 -
SystemServiceHelper.getTransactionCode
可能无法获取正确的事务码,比如android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
在 API 25 上不存在,而又存在android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47
(这种情况已经处理,但不排除可能存在其他情况)。该ShizukuBinderWrapper
方法不会遇到此问题。
-
开发 Shizuku 本身
建造
- 克隆
git clone --recurse-submodules
- 运行 gradle 任务
:manager:assembleDebug
或:manager:assembleRelease
该:manager:assembleDebug
任务会生成一个可调试的服务器。您可以连接调试器来shizuku_server
调试该服务器。请注意,在 Android Studio 中,应勾选“运行/调试配置”-“始终使用软件包管理器安装”,以确保服务器使用最新的代码。
执照
本项目中的所有代码文件均采用 Apache 2.0 许可
根据 Apache 2.0 第 6 节,具体如下:
-
禁止使用图像文件,除非用于显示 Shizuku 本身。
manager/src/main/res/mipmap*/ic_launcher*.png
-
禁止将其用作
Shizuku
应用程序名称、moe.shizuku.privileged.api
应用程序 ID 或声明moe.shizuku.manager.permission.*
权限。