一.安装xposed安装器
建议下载安卓模拟器(夜神模拟器等),在模拟器中测试使用,避免因为xposed的安装导致手机变砖;
下载安装器之后,打开安装器,选择框架 > 安装更新,根据提示进行操作,安装完成之后显示一下界面:
二.写代码
创建xposed相关模块,先创建一个项目,我这里包名为"cn.xpx.xpx";
引入xposed相关联的库文件,这个版本很多,方法也有很多,有的下载jar包什么的,我这里引荐官方的方法,通过gradle引入相关库.
compileOnly 'de.robv.android.xposed:api:82'
有兴趣的朋友可以去github的wiki里面详细查看,附网址
下载相关库文件之后,就开始写我们自己的代码了:
以MainActivity为例,抓取startAc()方法修改页面TextView显示的内容;
public String startAc() {
return "Hello";
}
原方法返回一个字符串"Hello",我的TextView拿到之后设置成这个字符串.
TextView textView = findViewById(R.id.lll);
textView.setText(startAc());
接下来创建一个类XpostedUt.class,名字随意取,该类要实现IXposedHookLoadPackage接口,实现其中的handleLoadPackage()方法,在这个方法中就可以去hook内容了;
public class XPostedUt implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
XposedHelpers.findAndHookMethod("cn.xpx.xpx.MainActivity",loadPackageParam.classLoader, "startAc", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
param.setResult("BaiBaiLe");
}
});
}
}
这里的afterHookedMethod()方法是在被hook的方法之后调用的,param.setResult()是把方法的返回结果修改为你填入的值,这部分具体的api我后面再整理出一个文档来;
写好这个方法之后,在与java同级的目录中创建assets静态资源文件夹,创建一个文件xposed_init,文件名必须为这个,这个配置文件用来设定你定义的hook类所在的位置,我这里填入的是cn.xpx.xpx.XPostedUt.
在你的配置文件中,添加三个配置文件:
<meta-data
android:name="xposedmodule"
android:value="true"/>
<meta-data
android:name="xposeddescription"
android:value="xpDemo"/>
<meta-data
android:name="xposedminversion"
android:value="82"/>
此时,运行项目,你会在xposed > 模块中看到你的模块;
注意,到这里还没有完成,如果你就这样运行了,那么恭喜你,你会看到xposed模块,也可以启动它,但就是不生效(当然也可能生效),如果不生效了,就要去配置一个东西,官方里面是这样写的:
Please make sure to disable Instant Run
(File -> Settings -> Build, Execution, Deployment -> Instant Run),
otherwise your classes aren't included directly in the APK,
but loaded via a stub application which Xposed can't handle.
配置好之后,重新启动,然后根据提示重启测试机即可;
三.Hook多个方法
多个方法的话,经过测试,只要在xposed_init中写上你创建的实现IXposedHookLoadPackage接口的类的全包名即可,每个实现IXposedHookLoadPackage接口的类可以针对不同的方法,类等进行操作;