Shizuku 可以帮助普通应用程序通过 app_process 启动的 Java 进程直接以 adb/root 权限使用系统 API。
背景
在开发需要 root 的应用程序时,最常见的方法是在 su shell 中运行一些命令。 例如,有一个应用程序使用 pm enable/disable 命令来启用/禁用组件。
这种方法有很大的缺点:
1.非常慢(创建多个进程)
2.需要处理文本(超级不可靠)
3.可能性仅限于可用命令
4.即使ADB有足够的权限,应用程序也需要root权限才能运行
Shizuku使用了完全不同的方式,可参阅下面的详细描述。
Shizuku是如何工作的?
首先,我们需要谈谈应用程序如何使用系统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是一样的。
评论