diff --git a/dexmaker/src/main/java/external/com/android/dx/DexMaker.java b/dexmaker/src/main/java/external/com/android/dx/DexMaker.java index 4cfd282ad..b4de0e360 100644 --- a/dexmaker/src/main/java/external/com/android/dx/DexMaker.java +++ b/dexmaker/src/main/java/external/com/android/dx/DexMaker.java @@ -483,7 +483,7 @@ public ClassLoader loadClassDirect(ClassLoader parent, File dexCache, String dex } public ClassLoader generateAndLoad(ClassLoader parent, File dexCache) throws IOException { - return generateAndLoad(parent, dexCache, generateFileName()); + return generateAndLoad(parent, dexCache, generateFileName(), false); } /** @@ -512,7 +512,7 @@ public ClassLoader generateAndLoad(ClassLoader parent, File dexCache) throws IOE * dex files will be written. If null, this class will try to guess the * application's private data dir. */ - public ClassLoader generateAndLoad(ClassLoader parent, File dexCache, String dexFileName) throws IOException { + public ClassLoader generateAndLoad(ClassLoader parent, File dexCache, String dexFileName, boolean deleteOld) throws IOException { if (dexCache == null) { String property = System.getProperty("dexmaker.dexcache"); if (property != null) { @@ -529,9 +529,14 @@ public ClassLoader generateAndLoad(ClassLoader parent, File dexCache, String dex File result = new File(dexCache, dexFileName); if (result.exists()) { - try { - deleteOldDex(result); - } catch (Throwable throwable) {} + if (deleteOld) { + try { + deleteOldDex(result); + } catch (Throwable throwable) { + } + } else { + return generateClassLoader(result, dexCache, parent); + } } byte[] dex = generate(); diff --git a/sandhook/build.gradle b/sandhook/build.gradle index 8a3f87fb2..14599c527 100644 --- a/sandhook/build.gradle +++ b/sandhook/build.gradle @@ -26,7 +26,6 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.jakewharton.android.repackaged:dalvik-dx:9.0.0_r3' implementation 'com.swift.sandhook:hooklib:3.0.1' compileOnly project(':dexmaker') compileOnly project(':xposedapi') diff --git a/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMaker.java b/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMaker.java index 19294727d..2092b3856 100644 --- a/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMaker.java +++ b/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMaker.java @@ -218,7 +218,7 @@ private HookWrapper.HookEntity doMake(String className, String dexName) throws E throw new IllegalArgumentException("dexDirPath should not be empty!!!"); } // Create the dex file and load it. - loader = mDexMaker.generateAndLoad(mAppClassLoader, new File(mDexDirPath), dexName); + loader = mDexMaker.generateAndLoad(mAppClassLoader, new File(mDexDirPath), dexName, true); return loadHookerClass(loader, className); } diff --git a/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMakerNew.java b/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMakerNew.java index 1303a3ffa..f3399c821 100644 --- a/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMakerNew.java +++ b/sandhook/src/main/java/com/swift/sandhook/xposedcompat/methodgen/HookerDexMakerNew.java @@ -172,7 +172,7 @@ private HookWrapper.HookEntity doMake(String className, String dexName) throws E throw new IllegalArgumentException("dexDirPath should not be empty!!!"); } // Create the dex file and load it. - loader = mDexMaker.generateAndLoad(mAppClassLoader, new File(mDexDirPath), dexName); + loader = mDexMaker.generateAndLoad(mAppClassLoader, new File(mDexDirPath), dexName, true); return loadHookerClass(loader, className); } diff --git a/sandhook/src/main/java/com/swift/sandhook/xposedcompat/utils/DexMakerUtils.java b/sandhook/src/main/java/com/swift/sandhook/xposedcompat/utils/DexMakerUtils.java index 909e59acc..ad9142df2 100644 --- a/sandhook/src/main/java/com/swift/sandhook/xposedcompat/utils/DexMakerUtils.java +++ b/sandhook/src/main/java/com/swift/sandhook/xposedcompat/utils/DexMakerUtils.java @@ -1,16 +1,4 @@ package com.swift.sandhook.xposedcompat.utils; -import external.com.android.dx.Code; -import external.com.android.dx.Local; -import external.com.android.dx.TypeId; -import com.android.dx.rop.code.Insn; -import com.android.dx.rop.code.PlainInsn; -import com.android.dx.rop.code.RegisterSpec; -import com.android.dx.rop.code.RegisterSpecList; -import com.android.dx.rop.code.Rops; -import com.android.dx.rop.code.SourcePosition; -import com.android.dx.rop.type.Type; - -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.math.BigInteger; import java.security.MessageDigest; @@ -18,6 +6,10 @@ import java.util.HashMap; import java.util.Map; +import external.com.android.dx.Code; +import external.com.android.dx.Local; +import external.com.android.dx.TypeId; + public class DexMakerUtils { @@ -219,44 +211,6 @@ public static void returnRightValue(Code code, Class returnType, Map result) { - addInstruction(code, new PlainInsn(Rops.opMoveException(Type.THROWABLE), - SourcePosition.NO_INFO, spec(result), RegisterSpecList.EMPTY)); - } - - public static void addInstruction(Code code, Insn insn) { - if (addInstMethod == null) { - try { - addInstMethod = Code.class.getDeclaredMethod("addInstruction", Insn.class); - addInstMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - } - try { - addInstMethod.invoke(code, insn); - } catch (IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - } - } - - public static RegisterSpec spec(Local result) { - if (specMethod == null) { - try { - specMethod = Local.class.getDeclaredMethod("spec"); - specMethod.setAccessible(true); - } catch (NoSuchMethodException e) { - e.printStackTrace(); - } - } - try { - return (RegisterSpec) specMethod.invoke(result); - } catch (IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - return null; - } - } - public static String MD5(String source) { try { MessageDigest messageDigest = MessageDigest.getInstance("MD5");