Generate class mapping at runtime

This commit is contained in:
topjohnwu
2022-02-13 06:22:42 -08:00
parent a4aa4a91a3
commit c09b4dabc4
7 changed files with 199 additions and 125 deletions
@@ -3,6 +3,7 @@ package com.topjohnwu.magisk;
import com.topjohnwu.magisk.utils.DynamicClassLoader;
import java.io.File;
import java.util.Map;
// Wrap the actual classloader as we only want to resolve classname
// mapping when loading from platform (via LoadedApk.mClassLoader)
@@ -14,19 +15,24 @@ class InjectedClassLoader extends ClassLoader {
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
return super.loadClass(Mapping.get(name), resolve);
String clz = DynLoad.componentMap.get(name);
name = clz != null ? clz : name;
return super.loadClass(name, resolve);
}
}
class RedirectClassLoader extends ClassLoader {
RedirectClassLoader() {
private final Map<String, Class<?>> mapping;
RedirectClassLoader(Map<String, Class<?>> m) {
super(RedirectClassLoader.class.getClassLoader());
mapping = m;
}
@Override
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
Class<?> clz = Mapping.internalMap.get(name);
Class<?> clz = mapping.get(name);
return clz == null ? super.loadClass(name, resolve) : clz;
}
}