From c72ea8ab463303393282783e57dfc8d6a75e8532 Mon Sep 17 00:00:00 2001 From: solohsu Date: Mon, 21 Jan 2019 01:49:35 +0800 Subject: [PATCH] Add a switch for loading modules dynamically, default as false --- .../com/elderdrivers/riru/xposed/Main.java | 8 +++++- .../riru/xposed/dexmaker/HookerDexMaker.java | 28 ++++++++++--------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java index cac9a190..c5978284 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/Main.java @@ -15,6 +15,7 @@ public class Main implements KeepAll { // private static String sForkAndSpecializePramsStr = ""; // private static String sForkSystemServerPramsStr = ""; public static String sAppDataDir = ""; + private static final boolean DYNAMIC_LOAD_MODULES = false; static { init(Build.VERSION.SDK_INT); @@ -35,6 +36,9 @@ public class Main implements KeepAll { // uid, gid, Arrays.toString(gids), debugFlags, Arrays.toString(rlimits), // mountExternal, seInfo, niceName, Arrays.toString(fdsToClose), // Arrays.toString(fdsToIgnore), startChildZygote, instructionSet, appDataDir); + if (!DYNAMIC_LOAD_MODULES) { + Router.onProcessForked(false); + } } public static void forkAndSpecializePost(int pid, String appDataDir) { @@ -42,7 +46,9 @@ public class Main implements KeepAll { if (pid == 0) { // in app process sAppDataDir = appDataDir; - Router.onProcessForked(false); + if (DYNAMIC_LOAD_MODULES) { + Router.onProcessForked(false); + } } else { // in zygote process, res is child zygote pid // don't print log here, see https://github.com/RikkaApps/Riru/blob/77adfd6a4a6a81bfd20569c910bc4854f2f84f5e/riru-core/jni/main/jni_native_method.cpp#L55-L66 diff --git a/Bridge/src/main/java/com/elderdrivers/riru/xposed/dexmaker/HookerDexMaker.java b/Bridge/src/main/java/com/elderdrivers/riru/xposed/dexmaker/HookerDexMaker.java index da36f495..cab0665e 100644 --- a/Bridge/src/main/java/com/elderdrivers/riru/xposed/dexmaker/HookerDexMaker.java +++ b/Bridge/src/main/java/com/elderdrivers/riru/xposed/dexmaker/HookerDexMaker.java @@ -3,15 +3,6 @@ package com.elderdrivers.riru.xposed.dexmaker; import android.os.Build; import android.text.TextUtils; -import external.com.android.dx.BinaryOp; -import external.com.android.dx.Code; -import external.com.android.dx.Comparison; -import external.com.android.dx.DexMaker; -import external.com.android.dx.FieldId; -import external.com.android.dx.Label; -import external.com.android.dx.Local; -import external.com.android.dx.MethodId; -import external.com.android.dx.TypeId; import com.elderdrivers.riru.xposed.core.HookMain; import java.io.File; @@ -26,6 +17,15 @@ import java.util.concurrent.atomic.AtomicLong; import dalvik.system.InMemoryDexClassLoader; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedBridge; +import external.com.android.dx.BinaryOp; +import external.com.android.dx.Code; +import external.com.android.dx.Comparison; +import external.com.android.dx.DexMaker; +import external.com.android.dx.FieldId; +import external.com.android.dx.Label; +import external.com.android.dx.Local; +import external.com.android.dx.MethodId; +import external.com.android.dx.TypeId; import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.autoBoxIfNecessary; import static com.elderdrivers.riru.xposed.dexmaker.DexMakerUtils.autoUnboxIfNecessary; @@ -76,10 +76,12 @@ public class HookerDexMaker { private static final FieldId returnEarlyFieldId = paramTypeId.getField(TypeId.BOOLEAN, "returnEarly"); private static final TypeId xposedBridgeTypeId = TypeId.get(XposedBridge.class); - private static final MethodId logMethodId = + private static final MethodId logThrowableMethodId = xposedBridgeTypeId.getMethod(TypeId.VOID, "log", throwableTypeId); + private static final MethodId logStrMethodId = + xposedBridgeTypeId.getMethod(TypeId.VOID, "log", TypeId.STRING); - private static AtomicLong sClassNameSuffix = new AtomicLong(0); + private static AtomicLong sClassNameSuffix = new AtomicLong(1); private FieldId mHookInfoFieldId; private FieldId mMethodFieldId; @@ -405,7 +407,7 @@ public class HookerDexMaker { // start of catch code.mark(tryBeforeCatch); code.moveException(throwable); - code.invokeStatic(logMethodId, null, throwable); + code.invokeStatic(logThrowableMethodId, null, throwable); code.invokeVirtual(setResultMethodId, null, param, nullObj); code.loadConstant(returnEarly, false); code.iput(returnEarlyFieldId, param, returnEarly); @@ -476,7 +478,7 @@ public class HookerDexMaker { // catch code.mark(tryAfterCatch); code.moveException(throwable); - code.invokeStatic(logMethodId, null, throwable); + code.invokeStatic(logThrowableMethodId, null, throwable); // if lastThrowable == null, go to recover lastResult code.compareZ(Comparison.EQ, noBackupThrowable, lastThrowable); // lastThrowable != null, recover lastThrowable