Shizuku
Shizuku

Shizuku13.6.0

官方版无广告62

通过以 app_process 启动的 Java 进程,从普通应用程序直接使用具有 adb/root 权限的系统 API。

更新日期:
2025年8月3日
分类标签:
语言:
中文
平台:

12 人已下载

背景

 

在开发需要 root 权限的应用时,最常用的方法是在 su shell 中运行一些命令。例如,有一个应用使用该pm enable/disable命令来启用/禁用组件。

这种方法有很大的缺点:

  1. 极其缓慢(创建多个进程)
  2. 需要处理文本(超级不可靠
  3. 可能性仅限于可用的命令
  4. 即使 ADB 具有足够的权限,应用程序也需要 root 权限才能运行

Shizuku 采用了完全不同的方式。请参阅下文的详细说明。

用户指南及下载

 

https://shizuku.rikka.app/

Shizuku 如何工作?

 

首先,我们需要讨论一下应用程序如何使用系统 API。例如,如果应用程序想要获取已安装的应用程序,我们都知道应该使用PackageManager#getInstalledPackages()。这实际上是应用程序进程和系统服务器进程之间的进程间通信 (IPC) 过程,只是 Android 框架为我们完成了内部工作。

Android 用于binder执行这种类型的 IPC。Binder允许服务器端了解客户端的 uid 和 pid,以便系统服务器可以检查应用程序是否有权限执行该操作。

通常,如果存在一个“管理器”(例如)供应用使用,那么系统服务器进程中PackageManager就应该有一个“服务”(例如)。我们可以简单地理解,如果应用持有该“服务”的 ,它就可以与该“服务”进行通信。应用进程在启动时会收到系统服务的绑定器。PackageManagerServicebinder

Shizuku 会引导用户先用 root 或 ADB 运行一个进程,即 Shizuku server。应用启动时,binder也会向应用发送 to Shizuku server 的消息。

Shizuku 提供的最重要的功能就像一个中间人,负责接收来自应用程序的请求,将其发送到系统服务器,并返回结果。您可以transactRemoterikka.shizuku.server.ShizukuService类中查看该方法,并moe.shizuku.api.ShizukuBinderWrapper在类中查看详细信息。

这样,我们达到了目标,能够以更高的权限使用系统 API。对于应用来说,这几乎与直接使用系统 API 完全相同。

开发人员指南

 

API 和示例

 

https://github.com/RikkaApps/Shizuku-API

从 v11 之前的版本迁移

 

当然,现有的应用程序仍然有效。

https://github.com/RikkaApps/Shizuku-API#migration-guide-for-existing-applications-use-shizuku-pre-v11

注意力

 

  1. ADB权限受限

    ADB 的权限有限,且在不同系统版本上有所差异。您可以在此处查看授予 ADB 的权限。

    在调用 API 之前,您可以使用ShizukuService#getUid检查 Shizuku 是否正在运行用户 ADB,或者使用ShizukuService#checkPermission检查服务器是否有足够的权限。

  2. Android 9 的隐藏 API 限制

    从 Android 9 开始,普通应用使用隐藏 API 的功能将受到限制。请使用其他方法(例如https://github.com/LSPosed/AndroidHiddenApiBypass)。

  3. Android 8.0 和 ADB

    目前,Shizuku 服务获取应用进程的方式是结合IActivityManager#registerProcessObserverIActivityManager#registerUidObserver(26+),以确保应用启动时会发送应用进程。然而,在 API 26 上,ADB 缺少使用 的权限registerUidObserver,因此如果您需要在可能并非由 Activity 启动的进程中使用 Shizuku,建议通过启动透明 Activity 来触发发送 Binder。

  4. 直接使用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.*权限。

相关软件

暂无评论

none
暂无评论...