Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix methodinfo with different classloader #61

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,23 @@

public class ProxyClassLoader extends ClassLoader {

private final ClassLoader mClassLoader;
private ClassLoader mClassLoader;

public ProxyClassLoader(ClassLoader parentCL, ClassLoader appCL) {
super(parentCL);
mClassLoader = appCL;
}

public ProxyClassLoader(ClassLoader parent)
{
super(parent);
}

public void setChild(ClassLoader child)
{
mClassLoader = child;
}

@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class clazz = null;
Expand All @@ -21,10 +31,10 @@ protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundE
if (clazz == null) {
clazz = super.loadClass(name, resolve);
if (clazz == null) {
throw new ClassNotFoundException();
throw new ClassNotFoundException("class not found in this scope "+name);
}
}

return clazz;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -72,8 +72,22 @@ public static synchronized void hookMethod(Member hookMethod, XposedBridge.Addit
} else {
hookMaker = defaultHookMaker;
}

ProxyClassLoader loader = new ProxyClassLoader(hookMethod.getDeclaringClass().getClassLoader());
loader.setChild(DynamicBridge.class.getClassLoader());

hookMaker.start(hookMethod, additionalHookInfo,
new ProxyClassLoader(DynamicBridge.class.getClassLoader(), hookMethod.getDeclaringClass().getClassLoader()), dexDir == null ? null : dexDir.getAbsolutePath());
// -----------
// 如果优先搜索当前类的类加载器,就会有相应方法类加载器复用
// 并且有的手机魔改了libcore,例如小米MIUI12的部分机型
// 造成提示XposedBridge.AdditionalHookInfo类加载器不对的问题。
// 用最简单的方法解决问题,你当然可以直接动态代理AdditionalHookInfo里面的callback
// 也可以合并Elements,你喜欢就行。
// 但是我们解决问题,优先采用简单粗暴的方法。
// QQ 647564826
// hookMethod classloader must be parent
loader,
dexDir == null ? null : dexDir.getAbsolutePath());
hookedInfo.put(hookMethod, hookMaker.getCallBackupMethod());
}
DexLog.d("hook method <" + hookMethod.toString() + "> cost " + (System.currentTimeMillis() - timeStart) + " ms, by " + (stub != null ? "internal stub" : "dex maker"));
Expand Down