1. 准备工作
1.1. 新建一个Android Project
1.2. 修改AndroidManifest.xml文件
<!-- xposed识别用,表示此app是个xposed模块 -->
<meta-data
android:name="xposedmodule"
android:value="true" />
<!-- 模块描述 -->
<meta-data
android:name="xposeddescription"
android:value="劫持样例"/>
<!--最低版本号 -->
<meta-data
android:name="xposedminversion"
android:value="30"/>
1.3. 修改app/build.gradle导入xposed依赖
在android {}的同级别添加如下内容,表示从jcenter仓库中找包
repositories {
jcenter()
}
在dependencies中添加如下内容(必须是compileOnly )
compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
1.4. 增加xposed_init
- 在main目录下新增assets文件夹
- 在assets文件夹下新增文件xposed_init
最后的目录结构为:app\src\main\assets\xposed_init
xposed_init的作用为存放Xpose Hook代码的入口类,格式大致如下,存放自己写的Hook代码的包名.类名即可
com.example.androidhookdemo.Main_JG
com.example.androidhookdemo.Main_JG2
com.example.androidhookdemo.Main3
2. 代码实现
2.1. 新建一个类,实现接口IXposedHookLoadPackage的方法handleLoadPackage
一个简单的算是固定写法吧,一般开头这么写就可以满足需求了
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
//新建一个类,实现接口IXposedHookLoadPackage
public class Main_JG implements IXposedHookLoadPackage {
@Override
//实现接口定义的方法handleLoadPackage
public void handleLoadPackage(final XC_LoadPackage.
LoadPackageParam lpparam) throws Throwable {
.......//这里是具体的Hook代码,下面写
}
2.2. 使用findAndHookMethod来Hook目标方法
先导入:import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
- 使用findAndHookMethod方法Hook目标方法,findAndHookMethod(目标class名,lpparam.classLoader,方法名,参数1,参数2....,new XC_MethodHook(){实现beforeHookedMethod和afterHookedMethod方法})
XC_MethodHook:在目标方法执行前/后运行相应的替换函数;
beforeHookedMethod 主要用来读取和修改参数
afterHookedMethod 主要用来修改返回值以及查看修改是否生效
XC_MethodHook可以替换为XC_MethodReplace:完全替换目标方法,执行用户自定义方法。
//过滤掉不符合要求的类,可以打一下日志,看看是否正常
if (lpparam.packageName.equals("com.example.xiaoming")){
XposedBridge.log("Loaded app: " + lpparam.packageName);
//先导入import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
//使用findAndHookMethod方法Hook目标方法,findAndHookMethod(目标class名,lpparam.classLoader,方法名,参数1,参数2....,
// new XC_MethodHook(){实现beforeHookedMethod和afterHookedMethod方法})
//XC_MethodHook:在目标方法执行前/后运行相应的替换函数;
//beforeHookedMethod 主要用来读取和修改参数
//afterHookedMethod 主要用来修改返回值以及查看修改是否生效
//XC_MethodReplace:完全替换目标方法,执行用户自定义的新方法。
findAndHookMethod("com.example.xiaoming.myapplication.MainActivity",
lpparam.classLoader,
"getString",
String.class,new XC_MethodHook(){
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("开始劫持了~");
XposedBridge.log("参数1 = " + param.args[0]);
String s = (String)param.args[0];
Integer i = Integer.valueOf(s);
i = i + 1;
s = i + "";
//修改被hook方法的参数
param.args[0] = s;
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
XposedBridge.log("劫持结束了~");
XposedBridge.log("参数1 = " + param.args[0]);
}
});