Fix crashes when forking webview_zygote on OnePlus devices

This commit is contained in:
solohsu 2019-04-30 22:35:42 +08:00
parent b99089fafa
commit 17c703e74e
12 changed files with 89 additions and 22 deletions

View File

@ -2,10 +2,10 @@ import org.gradle.internal.os.OperatingSystem
apply plugin: 'com.android.library'
version "v0.4.1.0_beta"
version "v0.4.1.2_beta"
ext {
versionCode = "4101"
versionCode = "4120"
module_name = "EdXposed"
jar_dest_dir = "${projectDir}/template_override/system/framework/"
is_windows = OperatingSystem.current().isWindows()

View File

@ -1,6 +1,6 @@
#!/system/bin/sh
EDXP_VERSION="0.4.1.0_beta (4101)"
EDXP_VERSION="0.4.1.2_beta (4120)"
ANDROID_SDK=`getprop ro.build.version.sdk`
BUILD_DESC=`getprop ro.build.description`
PRODUCT=`getprop ro.build.product`

View File

@ -14,7 +14,6 @@ import com.elderdrivers.riru.edxp.sandhook.entry.bootstrap.SysInnerHookInfo;
import com.elderdrivers.riru.edxp.sandhook.entry.bootstrap.WorkAroundHookInfo;
import com.elderdrivers.riru.edxp.sandhook.entry.hooker.SystemMainHooker;
import com.elderdrivers.riru.edxp.util.Utils;
import com.swift.sandhook.SandHookConfig;
import com.swift.sandhook.xposedcompat.XposedCompat;
import java.util.concurrent.atomic.AtomicBoolean;
@ -32,9 +31,12 @@ public class Router {
static boolean useSandHook = false;
public static void prepare(boolean isSystem) {
startWorkAroundHook();
public static void initResourcesHook() {
startWorkAroundHook(); // for OnePlus devices
XposedBridge.initXResources();
}
public static void prepare(boolean isSystem) {
// this flag is needed when loadModules
startsSystemServer = isSystem;
}
@ -125,8 +127,15 @@ public class Router {
}
}
public static void onEnterChildProcess() {
public static void onForkStart() {
forkCompleted = false;
}
public static void onForkFinish() {
forkCompleted = true;
}
public static void onEnterChildProcess() {
DynamicBridge.onForkPost();
//enable compile in child process
//SandHook.enableCompiler(!XposedInit.startsSystemServer);

View File

@ -2,17 +2,17 @@ package com.elderdrivers.riru.edxp.sandhook.proxy;
import android.text.TextUtils;
import com.elderdrivers.riru.edxp.Main;
import com.elderdrivers.riru.edxp.config.ConfigManager;
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
import com.elderdrivers.riru.edxp.util.ProcessUtils;
import com.elderdrivers.riru.edxp.util.Utils;
import com.elderdrivers.riru.edxp.Main;
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
import de.robv.android.xposed.XposedBridge;
import static com.elderdrivers.riru.edxp.util.FileUtils.getDataPathPrefix;
import static com.elderdrivers.riru.edxp.Main.isAppNeedHook;
import static com.elderdrivers.riru.edxp.util.FileUtils.getDataPathPrefix;
/**
* 1. Non dynamic mode
@ -73,6 +73,8 @@ public class BlackWhiteListProxy {
* Some details are different between main zygote and secondary zygote.
*/
private static void onForkPreForNonDynamicMode(boolean isSystemServer) {
Router.onForkStart();
Router.initResourcesHook();
ConfigManager.setDynamicModulesMode(false);
// set startsSystemServer flag used when loadModules
Router.prepare(isSystemServer);
@ -92,20 +94,25 @@ public class BlackWhiteListProxy {
Main.niceName = niceName;
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
Router.onEnterChildProcess();
if (!isDynamicModulesMode) {
Main.reopenFilesAfterForkNative();
}
Router.onEnterChildProcess();
if (!checkNeedHook(appDataDir, niceName)) {
// if is blacklisted, just stop here
Router.onForkFinish();
return;
}
if (isDynamicModulesMode) {
Router.initResourcesHook();
}
Router.prepare(isSystemServer);
PrebuiltMethodsDeopter.deoptBootMethods();
Router.installBootstrapHooks(isSystemServer);
if (isDynamicModulesMode) {
Router.loadModulesSafely(false);
}
Router.onForkFinish();
}
private static boolean checkNeedHook(String appDataDir, String niceName) {

View File

@ -1,7 +1,7 @@
package com.elderdrivers.riru.edxp.sandhook.proxy;
import com.elderdrivers.riru.edxp.config.ConfigManager;
import com.elderdrivers.riru.edxp.Main;
import com.elderdrivers.riru.edxp.config.ConfigManager;
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
@ -15,6 +15,8 @@ public class NormalProxy {
boolean startChildZygote, String instructionSet,
String appDataDir) {
// mainly for secondary zygote
Router.onForkStart();
Router.initResourcesHook();
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
// call this to ensure the flag is set to false ASAP
@ -36,10 +38,13 @@ public class NormalProxy {
Router.onEnterChildProcess();
// load modules for each app process on its forked if dynamic modules mode is on
Router.loadModulesSafely(false);
Router.onForkFinish();
}
public static void forkSystemServerPre(int uid, int gid, int[] gids, int debugFlags, int[][] rlimits,
long permittedCapabilities, long effectiveCapabilities) {
Router.onForkStart();
Router.initResourcesHook();
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
// set startsSystemServer flag used when loadModules
@ -65,6 +70,7 @@ public class NormalProxy {
Router.onEnterChildProcess();
// reload module list if dynamic mode is on
Router.loadModulesSafely(false);
Router.onForkFinish();
}
}

View File

@ -5,8 +5,8 @@ import android.text.TextUtils;
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
import com.elderdrivers.riru.edxp.util.Utils;
import com.elderdrivers.riru.edxp.whale.config.WhaleHookProvider;
import com.elderdrivers.riru.edxp.whale.config.WhaleEdxpConfig;
import com.elderdrivers.riru.edxp.whale.config.WhaleHookProvider;
import com.elderdrivers.riru.edxp.whale.core.HookMain;
import com.elderdrivers.riru.edxp.whale.entry.bootstrap.AppBootstrapHookInfo;
import com.elderdrivers.riru.edxp.whale.entry.bootstrap.SysBootstrapHookInfo;
@ -25,10 +25,12 @@ public class Router {
private static volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
public static void initResourcesHook() {
startWorkAroundHook(); // for OnePlus devices
XposedBridge.initXResources();
}
public static void prepare(boolean isSystem) {
startWorkAroundHook();
XposedBridge.initXResources();
// this flag is needed when loadModules
XposedInit.startsSystemServer = isSystem;
}
@ -102,10 +104,18 @@ public class Router {
WorkAroundHookInfo.class.getName());
}
public static void onEnterChildProcess() {
public static void onForkStart() {
forkCompleted = false;
}
public static void onForkFinish() {
forkCompleted = true;
}
public static void onEnterChildProcess() {
}
public static void logD(String prefix) {
Utils.logD(String.format("%s: pkg=%s, prc=%s", prefix, AndroidAppHelper.currentPackageName(),
AndroidAppHelper.currentProcessName()));

View File

@ -73,6 +73,8 @@ public class BlackWhiteListProxy {
* Some details are different between main zygote and secondary zygote.
*/
private static void onForkPreForNonDynamicMode(boolean isSystemServer) {
Router.onForkStart();
Router.initResourcesHook();
ConfigManager.setDynamicModulesMode(false);
// set startsSystemServer flag used when loadModules
Router.prepare(isSystemServer);
@ -92,20 +94,25 @@ public class BlackWhiteListProxy {
Main.niceName = niceName;
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
Router.onEnterChildProcess();
if (!isDynamicModulesMode) {
Main.reopenFilesAfterForkNative();
}
Router.onEnterChildProcess();
if (!checkNeedHook(appDataDir, niceName)) {
// if is blacklisted, just stop here
Router.onForkFinish();
return;
}
if (isDynamicModulesMode) {
Router.initResourcesHook();
}
Router.prepare(isSystemServer);
PrebuiltMethodsDeopter.deoptBootMethods();
Router.installBootstrapHooks(isSystemServer);
if (isDynamicModulesMode) {
Router.loadModulesSafely(false);
}
Router.onForkFinish();
}
private static boolean checkNeedHook(String appDataDir, String niceName) {

View File

@ -15,6 +15,8 @@ public class NormalProxy {
boolean startChildZygote, String instructionSet,
String appDataDir) {
// mainly for secondary zygote
Router.onForkStart();
Router.initResourcesHook();
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
// call this to ensure the flag is set to false ASAP
@ -36,10 +38,13 @@ public class NormalProxy {
Router.onEnterChildProcess();
// load modules for each app process on its forked if dynamic modules mode is on
Router.loadModulesSafely(false);
Router.onForkFinish();
}
public static void forkSystemServerPre(int uid, int gid, int[] gids, int debugFlags, int[][] rlimits,
long permittedCapabilities, long effectiveCapabilities) {
Router.onForkStart();
Router.initResourcesHook();
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
// set startsSystemServer flag used when loadModules
@ -65,6 +70,7 @@ public class NormalProxy {
Router.onEnterChildProcess();
// reload module list if dynamic mode is on
Router.loadModulesSafely(false);
Router.onForkFinish();
}
}

View File

@ -26,10 +26,12 @@ public class Router {
private static volatile AtomicBoolean bootstrapHooked = new AtomicBoolean(false);
public static void initResourcesHook() {
startWorkAroundHook(); // for OnePlus devices
XposedBridge.initXResources();
}
public static void prepare(boolean isSystem) {
startWorkAroundHook();
XposedBridge.initXResources();
// this flag is needed when loadModules
XposedInit.startsSystemServer = isSystem;
}
@ -103,8 +105,15 @@ public class Router {
WorkAroundHookInfo.class.getName());
}
public static void onEnterChildProcess() {
public static void onForkStart() {
forkCompleted = false;
}
public static void onForkFinish() {
forkCompleted = true;
}
public static void onEnterChildProcess() {
DynamicBridge.onForkPost();
}

View File

@ -5,9 +5,9 @@ import android.text.TextUtils;
import com.elderdrivers.riru.edxp.Main;
import com.elderdrivers.riru.edxp.config.ConfigManager;
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
import com.elderdrivers.riru.edxp.yahfa.entry.Router;
import com.elderdrivers.riru.edxp.util.ProcessUtils;
import com.elderdrivers.riru.edxp.util.Utils;
import com.elderdrivers.riru.edxp.yahfa.entry.Router;
import de.robv.android.xposed.XposedBridge;
@ -73,6 +73,8 @@ public class BlackWhiteListProxy {
* Some details are different between main zygote and secondary zygote.
*/
private static void onForkPreForNonDynamicMode(boolean isSystemServer) {
Router.onForkStart();
Router.initResourcesHook();
ConfigManager.setDynamicModulesMode(false);
// set startsSystemServer flag used when loadModules
Router.prepare(isSystemServer);
@ -92,20 +94,25 @@ public class BlackWhiteListProxy {
Main.niceName = niceName;
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
Router.onEnterChildProcess();
if (!isDynamicModulesMode) {
Main.reopenFilesAfterForkNative();
}
Router.onEnterChildProcess();
if (!checkNeedHook(appDataDir, niceName)) {
// if is blacklisted, just stop here
Router.onForkFinish();
return;
}
if (isDynamicModulesMode) {
Router.initResourcesHook();
}
Router.prepare(isSystemServer);
PrebuiltMethodsDeopter.deoptBootMethods();
Router.installBootstrapHooks(isSystemServer);
if (isDynamicModulesMode) {
Router.loadModulesSafely(false);
}
Router.onForkFinish();
}
private static boolean checkNeedHook(String appDataDir, String niceName) {

View File

@ -15,6 +15,8 @@ public class NormalProxy {
boolean startChildZygote, String instructionSet,
String appDataDir) {
// mainly for secondary zygote
Router.onForkStart();
Router.initResourcesHook();
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
// call this to ensure the flag is set to false ASAP
@ -36,10 +38,13 @@ public class NormalProxy {
Router.onEnterChildProcess();
// load modules for each app process on its forked if dynamic modules mode is on
Router.loadModulesSafely(false);
Router.onForkFinish();
}
public static void forkSystemServerPre(int uid, int gid, int[] gids, int debugFlags, int[][] rlimits,
long permittedCapabilities, long effectiveCapabilities) {
Router.onForkStart();
Router.initResourcesHook();
final boolean isDynamicModulesMode = Main.isDynamicModulesEnabled();
ConfigManager.setDynamicModulesMode(isDynamicModulesMode);
// set startsSystemServer flag used when loadModules
@ -65,6 +70,7 @@ public class NormalProxy {
Router.onEnterChildProcess();
// reload module list if dynamic mode is on
Router.loadModulesSafely(false);
Router.onForkFinish();
}
}