原理就是binder机制使用aidl等封装在shizuku里面,整个接入对安卓源码架构要求较高,建议先多看看官方的安卓源码。
这里是小白教学版本,具体原理不再展示,按照我这个复现就一定能成功接入shizuku并且授权成功:
如果你能看到这篇文章说明你找这个方案有一段时间了,至于shizuku官网的东西自己去看。
这边因为弄完很晚了,这些添加依赖官网都有自己去拿,我都截图展示了,还是不会后续我有空再出个版本,最近一直学习挺忙。
在你的app gradle添加之后还要在清单文件添加provider:
还有在gradle打开aidl和编译配置开
好了准备工作就都完成了,这时候你打开shizuku在授权管理里面就能看到你开发的demo应用了。
下面则是具体aidl的编程和具体授权。
首先我们要添加目录和文件
名字和位置都保持和我一样原因不解释了。小白文
AIDL(Android Interface Definition Language)是一种用于定义进程间通信(IPC)的语言。在 Android 中,AIDL 文件用于描述客户端和服务端之间的接口,使得不同进程可以通过 Binder 机制进行通信。普及下吧还是。
package com.example.userservice;
// 定义 IUserService 接口
interface IUserService {
// 定义一个获取用户名的方法
String getUserName(int userId);
// 定义一个设置用户名的方法
void setUserName(int userId, String userName);
// 定义一个删除用户的方法
void removeUser(int userId);
}
当你在项目中添加一个 AIDL 文件后,Android 构建系统会自动生成对应的 Java 接口文件。这些生成的文件将放在 build/generated/source/aidl
目录下。
例如,对于 IUserService.aidl
文件,生成的 Java 接口文件会包含一个名为 Stub
的内部类,它实现了所有定义的方法,并且处理 IPC 机制。
他最后是自动生成的generated标识不要手动去修改没用。
简而言之就是你通过aidl这个中间桥梁,你可以在你的客户端MainActivity里面去调用服务端(两个端跨进程了,然后shizuku依赖性可以说是服务端的一部分,他收到你客户端的指令再交由系统级别进行执行)
在客户端绑定服务并调用 AIDL 接口的方法:
必须知道的东西是,这些ServiceConnection并非shizuku导入特有他本是就是安卓常用的方式之一。
aidl里面声明这些就行,然后重建一遍就会自动生成。然后就是创建一个服务类继承重写这些方法:继承的是.Stub类为什么要加这个呢是因为系统自动生成的java接口里面创建的类就是这个,里面有一些细节需要安卓帮忙完成所以只能是这个类你点进去就能看到。
这三个方法就行最底下。前两个直接销毁服务就行
最后一个具体看你自己要不要执行什么,有些native开发也会用到一些,
这里演示我就直接销毁。里面可以执行shell命令
最后我们回到客户端MainActivity.class进行服务的绑定,绑定通常需要两个参数。
userServiceArgs, serviceConnection
前面是服务连接参数,后面是服务连接通道,你需要在里面指定一下你的服务是哪个,好让shizuku知道你的IUserService,没看教程之前大家的报错大概率是因为binder donot received。哈哈对于刚接触的话查了源码也难找,主要知道要用aidl就好弄了。
因为我们在initshizuku里面做连接,就把这两个参数在下面完成
要偷懒的话你直接去shizuku官网demo里面复制,我这里就不复制了没时间。
服务连接重写两个方法即可,connect和destroy
IUserService iUserService = IUserService.Stub.asInterface(iBinder);这句必须加上shizuku才能正常用。下面的不用管那是别人demo执行shell命令的
最后记得开发一下调用权限,shizulu就能正常使用了。最好不要公开。
最后你授权回调了可以用code判别不过这里简单处理,授权成功直接绑定服务即可,后面如果是授权和功能按钮共用的话可以code判别。
简单测试一下