wip compare class laoder
This commit is contained in:
parent
59d6caabd8
commit
1884ff4ac8
7 changed files with 326 additions and 108 deletions
|
|
@ -14,6 +14,14 @@ import java.lang.reflect.Method;
|
|||
import com.example.theseus.Utils;
|
||||
|
||||
public class Main {
|
||||
static ClassLoader delegateLastClassLoaderParent = null;
|
||||
static ClassLoader delegateLastClassLoader = null;
|
||||
static ClassLoader dexClassLoaderParent = null;
|
||||
static ClassLoader dexClassLoader = null;
|
||||
static ClassLoader inMemoryDexClassLoaderParent = null;
|
||||
static ClassLoader inMemoryDexClassLoader = null;
|
||||
static ClassLoader pathClassLoaderParent = null;
|
||||
static ClassLoader pathClassLoader = null;
|
||||
|
||||
public static String getdexfile(Activity ac, String name) throws Exception {
|
||||
File dexfile = new File(ac.getCacheDir(), name);
|
||||
|
|
@ -30,25 +38,65 @@ public class Main {
|
|||
}
|
||||
|
||||
public static void run(Activity ac, String clname, boolean hasCollision, boolean hasParent, String methodType) {
|
||||
ClassLoader cl = Main.class.getClassLoader();
|
||||
ClassLoader parent;
|
||||
try {
|
||||
Log.i("THESEUS", "clname: " + clname + ", hasCollision: " + hasCollision + ", hasParent: " + hasParent + ", methodType: " + methodType);
|
||||
ClassLoader cl;
|
||||
ClassLoader parent;
|
||||
String name = "a.dex";
|
||||
if (hasParent) {
|
||||
parent = Main.class.getClassLoader();
|
||||
name = "b.dex";
|
||||
} else {
|
||||
parent = null;
|
||||
}
|
||||
if (clname.equals("DelegateLastClassLoader")) {
|
||||
cl = new DelegateLastClassLoader(getdexfile(ac, "a.dex"), parent);
|
||||
if (parent == null) {
|
||||
if (delegateLastClassLoader == null) {
|
||||
delegateLastClassLoader = new DelegateLastClassLoader(getdexfile(ac, name), parent);
|
||||
}
|
||||
cl = delegateLastClassLoader;
|
||||
} else {
|
||||
if (delegateLastClassLoaderParent == null) {
|
||||
delegateLastClassLoaderParent = new DelegateLastClassLoader(getdexfile(ac, name), parent);
|
||||
}
|
||||
cl = delegateLastClassLoaderParent;
|
||||
}
|
||||
} else if (clname.equals("DexClassLoader")) {
|
||||
cl = new DexClassLoader(getdexfile(ac, "a.dex"), null, null, parent);
|
||||
if (parent == null) {
|
||||
if (dexClassLoader == null) {
|
||||
dexClassLoader = new DexClassLoader(getdexfile(ac, name), null, null, parent);
|
||||
}
|
||||
cl = dexClassLoader;
|
||||
} else {
|
||||
if (dexClassLoaderParent == null) {
|
||||
dexClassLoaderParent = new DexClassLoader(getdexfile(ac, name), null, null, parent);
|
||||
}
|
||||
cl = dexClassLoaderParent;
|
||||
}
|
||||
} else if (clname.equals("InMemoryDexClassLoader")) {
|
||||
cl = new InMemoryDexClassLoader(getdexbuffer(ac, "a.dex"), parent);
|
||||
if (parent == null) {
|
||||
if (inMemoryDexClassLoader == null) {
|
||||
inMemoryDexClassLoader = new InMemoryDexClassLoader(getdexbuffer(ac, name), parent);
|
||||
}
|
||||
cl = inMemoryDexClassLoader;
|
||||
} else {
|
||||
if (inMemoryDexClassLoaderParent == null) {
|
||||
inMemoryDexClassLoaderParent = new InMemoryDexClassLoader(getdexbuffer(ac, name), parent);
|
||||
}
|
||||
cl = inMemoryDexClassLoaderParent;
|
||||
}
|
||||
} else if (clname.equals("PathClassLoader")) {
|
||||
cl = new PathClassLoader(getdexfile(ac, "a.dex"), parent);
|
||||
} else {
|
||||
cl = Main.class.getClassLoader();
|
||||
if (parent == null) {
|
||||
if (pathClassLoader == null) {
|
||||
pathClassLoader = new PathClassLoader(getdexfile(ac, name), parent);
|
||||
}
|
||||
cl = pathClassLoader;
|
||||
} else {
|
||||
if (pathClassLoaderParent == null) {
|
||||
pathClassLoaderParent = new PathClassLoader(getdexfile(ac, name), parent);
|
||||
}
|
||||
cl = pathClassLoaderParent;
|
||||
}
|
||||
}
|
||||
|
||||
Class clz = null;
|
||||
|
|
@ -194,6 +242,7 @@ public class Main {
|
|||
return;
|
||||
};
|
||||
} catch (Exception e) {
|
||||
Log.e("THESEUS", "class loader name: " + cl.toString());
|
||||
Log.e("THESEUS", "error:", e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,6 +49,11 @@ public class MainActivity extends Activity {
|
|||
out = new FileOutputStream(outFile);
|
||||
Utils.copy(in, out);
|
||||
outFile.renameTo(new File(getCacheDir(), "a.dex")); // security?
|
||||
in = assetManager.open("a.dex");
|
||||
outFile = new File(getCacheDir(), "b.dex_");
|
||||
out = new FileOutputStream(outFile);
|
||||
Utils.copy(in, out);
|
||||
outFile.renameTo(new File(getCacheDir(), "b.dex"));
|
||||
} catch (IOException e) {}
|
||||
try {
|
||||
in.close();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue