XposeHelpers提供了一些辅助方法,我们可以使用findAndHookXXX:查找并Hook方法与构造方法。而且只能Hook方法与构造方法,不能Hook接口和抽象方法。如果直接拦截抽象方法,会出现下列错误:
//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会抛出如下错误:
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方法,所以会抛出异常。
但是有时候我们确实需要拦截抽象方法,这时候该怎么办呢?
抽象方法最终是需要被实现的,而且抽象方法的实现体才是我们需要拦截的部分,所以我们可以拦截具体的实现方法即可。
思路:1、反射获取抽象方法的实现类的实例对象mL2SyncSrv; 2、使用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; }
至此,我们需要拦截的抽象方法,即抽象方法的真正实现已经拦截成功。
总结:Xposed真的可以为所欲为,只要找对了方法,没有什么事Xposed不能做到的。