XposeHelpers提供了一些辅助方法,咱们可使用findAndHookXXX:查找并Hook方法与构造方法。并且只能Hook方法与构造方法,不能Hook接口和抽象方法。若是直接拦截抽象方法,会出现下列错误:java
//unregisterBiz方法为LongLinkSyncService的抽象方法
XposedHelpers.findAndHookMethod("com.alipay.mobile.rome.longlinkservice.LongLinkSyncService",
clzLd, "unregisterBiz", String.class, new XC_MethodHook()
{
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
});
复制代码
public abstract class LongLinkSyncService {
public abstract void unregisterBiz(String arg1);
}
复制代码
Xposed会抛出以下错误:android
E/Xposed: java.lang.IllegalArgumentException: Cannot hook abstract methods: public abstract void com.alipay.mobile.rome.longlinkservice.LongLinkSyncService.unregisterBiz(java.lang.String)
at de.robv.android.xposed.XposedBridge.hookMethod(XposedBridge.java:183)
at de.robv.android.xposed.XposedHelpers.findAndHookMethod(XposedHelpers.java:184)
at de.robv.android.xposed.XposedHelpers.findAndHookMethod(XposedHelpers.java:257)
at com.mediatek.autotest.assist.hook.Xposed.zfb.AlipayRTPaySessionHk.test(AlipayRTPaySessionHk.java:114)
at com.mediatek.autotest.assist.hook.Xposed.XposedEnter$1.afterHookedMethod(XposedEnter.java:55)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:348)
at android.app.Application.attach(<Xposed>)
at android.app.Instrumentation.newApplication(Instrumentation.java:1002)
at android.app.Instrumentation.newApplication(Instrumentation.java:986)
at android.app.LoadedApk.makeApplication(LoadedApk.java:582)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4947)
at de.robv.android.xposed.XposedBridge.invokeOriginalMethodNative(Native Method)
at de.robv.android.xposed.XposedBridge.handleHookedMethod(XposedBridge.java:334)
at android.app.ActivityThread.handleBindApplication(<Xposed>)
at android.app.ActivityThread.-wrap1(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1563)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5771)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:682)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:102)
复制代码
缘由是由于抽象方法仅仅只是被声明没有方法体,因此还须要被实现,而Xposed的不知道你想要拦截的是哪一个实现类的unregisterBiz方法,因此会抛出异常。微信
可是有时候咱们确实须要拦截抽象方法,这时候该怎么办呢?app
抽象方法最终是须要被实现的,并且抽象方法的实现体才是咱们须要拦截的部分,因此咱们能够拦截具体的实现方法便可。ide
思路:一、反射获取抽象方法的实现类的实例对象mL2SyncSrv;
二、使用XposedBridge.hookAllMethods具体的实现方法
复制代码
Class<?> syncSrvClass = mL2SyncSrv.getClass();
XposedBridge.hookAllMethods(syncSrvClass, "unregisterBiz", new XC_MethodHook()
{
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
param.setResult(null);
LogUtil.logic_e("hook unregisterBiz: suc : ");
}
});
复制代码
public synchronized static Object findAliService(ClassLoader clzLd, String serviceClsName) {
Object aliMicroAppClz = getAliMicroAppCxt(clzLd);
return aliMicroAppClz != null ? ReflectUtils.reflect(aliMicroAppClz).method("findServiceByInterface", serviceClsName).get() : null;
}
复制代码
至此,咱们须要拦截的抽象方法,即抽象方法的真正实现已经拦截成功。oop
总结:Xposed真的能够随心所欲,只要找对了方法,没有什么事Xposed不能作到的。spa
——只要你学会了以前所不会的东西,只要今天的你强过了昨天的你,那你就一直是在进阶的路上了。.net