Add a switch for loading modules dynamically, default as false

This commit is contained in:
solohsu 2019-01-21 01:49:35 +08:00
parent 117d3b2ecd
commit c72ea8ab46
2 changed files with 22 additions and 14 deletions

View File

@ -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;
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

View File

@ -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<XC_MethodHook.MethodHookParam, Boolean> returnEarlyFieldId =
paramTypeId.getField(TypeId.BOOLEAN, "returnEarly");
private static final TypeId<XposedBridge> xposedBridgeTypeId = TypeId.get(XposedBridge.class);
private static final MethodId<XposedBridge, Void> logMethodId =
private static final MethodId<XposedBridge, Void> logThrowableMethodId =
xposedBridgeTypeId.getMethod(TypeId.VOID, "log", throwableTypeId);
private static final MethodId<XposedBridge, Void> logStrMethodId =
xposedBridgeTypeId.getMethod(TypeId.VOID, "log", TypeId.STRING);
private static AtomicLong sClassNameSuffix = new AtomicLong(0);
private static AtomicLong sClassNameSuffix = new AtomicLong(1);
private FieldId<?, XposedBridge.AdditionalHookInfo> mHookInfoFieldId;
private FieldId<?, Member> 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