如今應用的體積愈來愈大,方法數突破65K上限愈來愈多,有的採用了Multidex方案,有的使用動態加載,而用Xposed 直接hook Multidex的其餘dex,或者動態加載裏的方法,會觸發異常。這兩種方式的解決方法不一樣,下面給出方案:java
因爲android最開始並無把classes2.dex(表明Multidex)和動態加載的dex加載進入,致使Xposed沒法識別。針對Multidex,先hook這個應用的Application類,在afterHookedMethod裏在hook你想要的類,以google play service爲例:android
XposedHelpers.findAndHookMethod("com.google.android.gms.common.app.GmsApplication", lpp.classLoader, "onCreate", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { final Class cls = XposedHelpers.findClass("owr", lpp.classLoader); Class oxaCls = XposedHelpers.findClass("oxa", lpp.classLoader); XposedHelpers.findAndHookConstructor(cls, Context.class, Executor.class, oxaCls, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { Field url = XposedHelpers.findField(cls, "m"); url.setAccessible(true); url.set(param.thisObject, ""); } }); } });
gms有5個dex文件,我想要hook的「owr」類在第三個dex文件中,先hook Application,再hook目標方法。若是該應用沒有繼承Application的類,那直接hook Application也能夠。app
上面的方法對於動態加載並不適用,針對動態加載,先hook目標類的父類,假如目標是自定義的ImageView,則hook ImageView,在afterHookedMethod就有你的目標類,經過這個類來得到classloader。ide
Class imageCls = XposedHelpers.findClass("android.widget.ImageView",lpp.classLoader); XposedBridge.hookAllConstructors(imageCls, new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { final Object imageObj = param.thisObject; String name = imageObj.getClass().getName(); XposedBridge.log("name:"+name); if("com.xx.yy".equals(name)){ XposedHelpers.findAndHookMethod("com.xx.yy", imageObj.getClass().getClassLoader(), "a", new XC_MethodHook() { @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { } }); } } });
目標是com.xx.yy 的a方法,imageObj.getClass().getClassLoader()纔是真正須要的classloader。this