如今应用的体积愈来愈大,方法数突破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