Dexposed 就简写 Dex 哈!
1.Dex 引入依赖库的时候只需要引入
compile 'com.taobao.android:dexposed:0.1.1’ (可加 arr)
和网上相比少了
native_dependencies {
artifact 'com.taobao.dexposed:dexposed_l:0.2+:armeabi'
artifact 'com.taobao.dexposed:dexposed:0.2+:armeabi'
}
dependencies {
compile files('libs/dexposedbridge.jar')
}
还是按照最新的来处理。
2.判断是否支持 Dex,需要用下面的判断,否则下面判断:
// check device if support and auto load libs
mIsSupported = DexposedBridge.canDexposed(this);
mIsLDevice = Build.VERSION.SDK_INT >= 21;
// check device if support and auto load libså
mIsSupported = DexposedBridge.canDexposed(this);
mIsLDevice = Build.VERSION.SDK_INT >= 21;
if (mIsSupported && !mIsLDevice) {
//TODO
}
三星手机是 5.0系统,但是运行后直接崩溃。
3.方法动态注入AOP的方式是:
01.方法执行之前之后的处理操作
DexposedBridge.findAndHookMethod(MainActivity.class, "setMyName", new
XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
MainActivity activity = (MainActivity) param.thisObject;
((TextView)activity.findViewById(R.id.tv)).setText(activity.noteText +
"我非要篡改你哈,不行就试试!");
}
});
02.替换当前方法的处理
DexposedBridge.hookAllMethods(MainActivity.class, "onClick", new XC_MethodReplacement() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
View view = (View) methodHookParam.args[0];
if (view.getId() == R.id.bt) {
AlertDialog.Builder dialog = new AlertDialog.Builder((Context) methodHookParam
.thisObject);
dialog.setMessage("O(∩_∩)O哈哈~,被劫持了哦!");
dialog.show();
}
return null;
}
});
public static Unhook findAndHookMethod(Class clazz, String methodName, Object... parameterTypesAndCallback)
{
}
class 是要修改类的名称或是父类例如: Activity.class, MainActivity.class。
methodName 是你要修改方法的名字,例如:setMute(),
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {}
参数 param:
参数包含了一些很有用的信息:
MethodHookParam.thisObject:这个类的一个实例
MethodHookParam.args:用于传递被注入函数的所有参数
MethodHookParam.setResult:用于修改原函数调用的结果,如果在beforeHookedMethod回调函数中调用setResult,可以阻止对原函数的调用。但是如果有返回值的话仍然需要通过hook处理器进行return操作。
MainActivity activity = (MainActivity) param.thisObject;
((TextView)activity.findViewById(R.id.tv)).setText(activity.noteText +
"我非要篡改你哈,不行就试试!");
可以通过 param.thisObject 获取当前的Activity,从而获取 当前的所有变量
可以用来处理统计信息。