Add support for switching between compat mode and speed mode (the latter as default)
This commit is contained in:
parent
258d40d01f
commit
0e88cee282
|
|
@ -1,14 +1,37 @@
|
||||||
package com.elderdrivers.riru.xposed.dexmaker;
|
package com.elderdrivers.riru.xposed.dexmaker;
|
||||||
|
|
||||||
import external.com.android.dx.Code;
|
import android.app.AndroidAppHelper;
|
||||||
import external.com.android.dx.Local;
|
import android.os.Build;
|
||||||
import external.com.android.dx.TypeId;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import com.elderdrivers.riru.xposed.Main;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import de.robv.android.xposed.SELinuxHelper;
|
||||||
|
import external.com.android.dx.Code;
|
||||||
|
import external.com.android.dx.Local;
|
||||||
|
import external.com.android.dx.TypeId;
|
||||||
|
|
||||||
public class DexMakerUtils {
|
public class DexMakerUtils {
|
||||||
|
|
||||||
|
private static final boolean IN_MEMORY_DEX_ELIGIBLE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
|
||||||
|
private static final String COMPAT_LIST_PATH = "/data/misc/riru/modules/edxposed/compatlist/";
|
||||||
|
|
||||||
|
public static boolean shouldUseInMemoryHook() {
|
||||||
|
if (!IN_MEMORY_DEX_ELIGIBLE) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String packageName = AndroidAppHelper.currentPackageName();
|
||||||
|
if (TextUtils.isEmpty(packageName)) { //default to true
|
||||||
|
DexLog.w("packageName is empty, processName=" + Main.sAppProcessName
|
||||||
|
+ ", appDataDir=" + Main.sAppDataDir);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return !SELinuxHelper.getAppDataFileService().checkFileExists(COMPAT_LIST_PATH + packageName);
|
||||||
|
}
|
||||||
|
|
||||||
public static void autoBoxIfNecessary(Code code, Local<Object> target, Local source) {
|
public static void autoBoxIfNecessary(Code code, Local<Object> target, Local source) {
|
||||||
String boxMethod = "valueOf";
|
String boxMethod = "valueOf";
|
||||||
TypeId<?> boxTypeId;
|
TypeId<?> boxTypeId;
|
||||||
|
|
@ -99,7 +122,7 @@ public class DexMakerUtils {
|
||||||
code.invokeVirtual(boxTypeId.getMethod(TypeId.SHORT, unboxMethod), target, boxTypedLocal);
|
code.invokeVirtual(boxTypeId.getMethod(TypeId.SHORT, unboxMethod), target, boxTypedLocal);
|
||||||
} else if (typeId.equals(TypeId.VOID)) {
|
} else if (typeId.equals(TypeId.VOID)) {
|
||||||
code.loadConstant(target, null);
|
code.loadConstant(target, null);
|
||||||
} else if (castObj){
|
} else if (castObj) {
|
||||||
code.cast(target, source);
|
code.cast(target, source);
|
||||||
} else {
|
} else {
|
||||||
code.move(target, source);
|
code.move(target, source);
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
import de.robv.android.xposed.XposedBridge;
|
import de.robv.android.xposed.XposedBridge;
|
||||||
|
|
||||||
import static com.elderdrivers.riru.xposed.dexmaker.HookerDexMaker.SHOULD_USE_IN_MEMORY_DEX;
|
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.shouldUseInMemoryHook;
|
||||||
import static com.elderdrivers.riru.xposed.util.FileUtils.getDataPathPrefix;
|
import static com.elderdrivers.riru.xposed.util.FileUtils.getDataPathPrefix;
|
||||||
|
|
||||||
public final class DynamicBridge {
|
public final class DynamicBridge {
|
||||||
|
|
@ -50,7 +50,7 @@ public final class DynamicBridge {
|
||||||
DexLog.d("start to generate class for: " + hookMethod);
|
DexLog.d("start to generate class for: " + hookMethod);
|
||||||
try {
|
try {
|
||||||
// for Android Oreo and later use InMemoryClassLoader
|
// for Android Oreo and later use InMemoryClassLoader
|
||||||
if (!SHOULD_USE_IN_MEMORY_DEX) {
|
if (!shouldUseInMemoryHook()) {
|
||||||
// under Android Oreo, using DexClassLoader
|
// under Android Oreo, using DexClassLoader
|
||||||
if (dexPathInited.compareAndSet(false, true)) {
|
if (dexPathInited.compareAndSet(false, true)) {
|
||||||
// delete previous compiled dex to prevent potential crashing
|
// delete previous compiled dex to prevent potential crashing
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
package com.elderdrivers.riru.xposed.dexmaker;
|
package com.elderdrivers.riru.xposed.dexmaker;
|
||||||
|
|
||||||
import android.os.Build;
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
|
|
||||||
import com.elderdrivers.riru.xposed.core.HookMain;
|
import com.elderdrivers.riru.xposed.core.HookMain;
|
||||||
|
|
@ -31,15 +30,10 @@ import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.autoBoxIfNeces
|
||||||
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.autoUnboxIfNecessary;
|
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.autoUnboxIfNecessary;
|
||||||
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.createResultLocals;
|
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.createResultLocals;
|
||||||
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.getObjTypeIdIfPrimitive;
|
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.getObjTypeIdIfPrimitive;
|
||||||
|
import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.shouldUseInMemoryHook;
|
||||||
|
|
||||||
public class HookerDexMaker {
|
public class HookerDexMaker {
|
||||||
|
|
||||||
public static final boolean IN_MEMORY_DEX_ELIGIBLE = Build.VERSION.SDK_INT >= Build.VERSION_CODES.O;
|
|
||||||
// using InMemoryDexClassLoader when too many methods (about >175 ?)
|
|
||||||
// are to hook might lead to large memory allocation and gc problems, forbid it for now
|
|
||||||
public static final boolean IN_MEMORY_DEX_FORBIDDEN = true;
|
|
||||||
public static final boolean SHOULD_USE_IN_MEMORY_DEX = IN_MEMORY_DEX_ELIGIBLE && !IN_MEMORY_DEX_FORBIDDEN;
|
|
||||||
|
|
||||||
public static final String METHOD_NAME_BACKUP = "backup";
|
public static final String METHOD_NAME_BACKUP = "backup";
|
||||||
public static final String METHOD_NAME_HOOK = "hook";
|
public static final String METHOD_NAME_HOOK = "hook";
|
||||||
public static final String METHOD_NAME_CALL_BACKUP = "callBackup";
|
public static final String METHOD_NAME_CALL_BACKUP = "callBackup";
|
||||||
|
|
@ -199,7 +193,7 @@ public class HookerDexMaker {
|
||||||
generateCallBackupMethod();
|
generateCallBackupMethod();
|
||||||
|
|
||||||
ClassLoader loader;
|
ClassLoader loader;
|
||||||
if (SHOULD_USE_IN_MEMORY_DEX) {
|
if (shouldUseInMemoryHook()) {
|
||||||
// in memory dex classloader
|
// in memory dex classloader
|
||||||
byte[] dexBytes = mDexMaker.generate();
|
byte[] dexBytes = mDexMaker.generate();
|
||||||
loader = new InMemoryDexClassLoader(ByteBuffer.wrap(dexBytes), mAppClassLoader);
|
loader = new InMemoryDexClassLoader(ByteBuffer.wrap(dexBytes), mAppClassLoader);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue