static synchronized S loadDex(byte[] dex, bool run) ctex { assertTrue("Not a dex file", isDex(dex)); Class j = getJavaX(); ClassLoader parentClassLoader = j.getClassLoader().getParent(); File dexDir = (File) call(j, "TempDirMaker_make"); File dexFile = new File(dexDir, "spontaneous.dex"); //File dexFile = prepareProgramFile("spontaneous.dex"); saveBinaryFile(dexFile, dex); print("dexFile: " + dexFile.getAbsolutePath()); assertEquals((long) dex.length, dexFile.length()); print("Dex size: " + dex.length); // For Android's optimized class data (must be an app-local dir) File dexOutputDir = makeAndroidTempDir(); Class dcl = Class.forName("dalvik.system.DexClassLoader"); O classLoader = dcl.getConstructors()[0].newInstance(dexFile.getAbsolutePath(), dexOutputDir.getAbsolutePath(), null, parentClassLoader); final Class mainClass = (Class) call(classLoader, "loadClass", "main"); hotwire_copyOver(mainClass); final O paa = nuObject(_getClass(j, j.getName() + "$PaA")); S injectionID; set(paa, "injectionID", injectionID = randomID(8)); set(paa, "mainClass", mainClass); call(j, "addInjection", paa); if (run) thread "Spontaneous DEX" { callMain(mainClass); } ret format("OK, injection id: *", injectionID); }