在开发需要 root 的应用程序时,最常见的方法是在 su shell 中运行一些命令。例如,有一个应用程序使用pm enable/disable
命令来启用/禁用组件。
这种方法有很大的缺点:
雫使用了完全不同的方式。请参阅下面的详细描述。
https://shizuku.rikka.app/
首先,我们需要谈谈应用程序如何使用系统API。例如,如果应用程序想要获取已安装的应用程序,我们都知道我们应该使用PackageManager#getInstalledPackages()
。这实际上是应用程序进程和系统服务器进程的进程间通信(IPC)过程,只是Android框架为我们做了内部工作。
Android使用binder
来做这种类型的IPC。 Binder
允许服务器端获知客户端的uid和pid,以便系统服务器检查应用程序是否有权限执行该操作。
通常,如果有一个“管理器”(例如, PackageManager
)供应用程序使用,那么系统服务器进程中应该有一个“服务”(例如, PackageManagerService
)。我们可以简单地认为,如果应用程序持有“服务”的binder
,那么它就可以与“服务”进行通信。应用程序进程将在启动时接收系统服务的绑定程序。
Shizuku 引导用户首先使用 root 或 ADB 运行一个进程、Shizuku 服务器。当应用程序启动时,Shizuku 服务器的binder
也会发送到应用程序。
Shizuku 提供的最重要的功能是充当中间人,接收来自应用程序的请求,将其发送到系统服务器,然后发回结果。详细信息可以查看rikka.shizuku.server.ShizukuService
类和moe.shizuku.api.ShizukuBinderWrapper
类中的transactRemote
方法。
这样,我们就达到了我们的目标,使用更高权限的系统API。而对于app来说,几乎和直接使用系统API是一样的。
https://github.com/RikkaApps/Shizuku-API
当然,现有的应用程序仍然有效。
https://github.com/RikkaApps/Shizuku-API#migration-guide-for-existing-applications-use-shizuku-pre-v11
ADB权限有限
ADB的权限有限,并且在不同的系统版本上有所不同。您可以在此处查看授予 ADB 的权限。
在调用API之前,您可以使用ShizukuService#getUid
检查Shizuku是否正在运行用户ADB,或者使用ShizukuService#checkPermission
检查服务器是否有足够的权限。
Android 9 的隐藏 API 限制
从 Android 9 开始,隐藏 API 的使用仅限于普通应用程序。请使用其他方法(例如https://github.com/LSPosed/AndroidHiddenApiBypass)。
安卓 8.0 和亚行
目前Shizuku服务获取app进程的方式是结合IActivityManager#registerProcessObserver
和IActivityManager#registerUidObserver
(26+)来保证app启动时发送app进程。但是,在 API 26 上,ADB 缺乏使用registerUidObserver
的权限,因此如果您需要在可能不是由 Activity 启动的进程中使用 Shizuku,建议通过启动透明 Activity 来触发发送绑定器。
直接使用transactRemote
需要注意
不同Android版本下API可能会有所不同,请务必仔细查看。此外, android.app.IActivityManager
在 API 26 及更高版本中具有 aidl 形式,并且android.app.IActivityManager$Stub
仅存在于 API 26 上。
SystemServiceHelper.getTransactionCode
可能无法获取到正确的事务码,例如API 25上不存在android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages
而存在android.content.pm.IPackageManager$Stub.TRANSACTION_getInstalledPackages_47
(这种情况已处理)与,但也不排除还有其他情况)。 ShizukuBinderWrapper
方法不会遇到此问题。
git clone --recurse-submodules
克隆:manager:assembleDebug
或:manager:assembleRelease
:manager:assembleDebug
任务生成可调试服务器。您可以将调试器附加到shizuku_server
来调试服务器。请注意,在Android Studio中,应选中“运行/调试配置”-“始终使用包管理器安装”,以便服务器将使用最新的代码。
该项目的代码可在 Apache-2.0 许可证下获得。
您禁止以任何方式使用下面列出的图像文件(除非用于显示 Shizuku 本身)。
manager/src/main/res/mipmap-hdpi/ic_launcher.png
manager/src/main/res/mipmap-hdpi/ic_launcher_background.png
manager/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
manager/src/main/res/mipmap-xhdpi/ic_launcher.png
manager/src/main/res/mipmap-xhdpi/ic_launcher_background.png
manager/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
manager/src/main/res/mipmap-xxhdpi/ic_launcher.png
manager/src/main/res/mipmap-xxhdpi/ic_launcher_background.png
manager/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
manager/src/main/res/mipmap-xxxhdpi/ic_launcher.png
manager/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png
manager/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
对于整个项目来说,它不是免费的。您禁止将您编译的apk(包括修改后的应用程序名称“Shizuku”重命名为其他名称)分发到任何商店(IBNLT Google Play Store、F-Droid、Amazon Appstore 等)。