From 17c703e74ec5b0f072f2763a58f906cfee85bc0b Mon Sep 17 00:00:00 2001 From: solohsu Date: Tue, 30 Apr 2019 22:35:42 +0800 Subject: [PATCH] Fix crashes when forking webview_zygote on OnePlus devices --- edxp-core/build.gradle | 4 ++-- .../common/util_functions.sh | 2 +- .../riru/edxp/sandhook/entry/Router.java | 17 +++++++++++++---- .../sandhook/proxy/BlackWhiteListProxy.java | 15 +++++++++++---- .../riru/edxp/sandhook/proxy/NormalProxy.java | 8 +++++++- .../riru/edxp/whale/entry/Router.java | 18 ++++++++++++++---- .../edxp/whale/proxy/BlackWhiteListProxy.java | 9 ++++++++- .../riru/edxp/whale/proxy/NormalProxy.java | 6 ++++++ .../riru/edxp/yahfa/entry/Router.java | 15 ++++++++++++--- .../edxp/yahfa/proxy/BlackWhiteListProxy.java | 11 +++++++++-- .../riru/edxp/yahfa/proxy/NormalProxy.java | 6 ++++++ hiddenapi-stubs/libs/framework-stub.jar | Bin 15372 -> 15372 bytes 12 files changed, 89 insertions(+), 22 deletions(-) diff --git a/edxp-core/build.gradle b/edxp-core/build.gradle index 3add2f4b..f6bb092a 100644 --- a/edxp-core/build.gradle +++ b/edxp-core/build.gradle @@ -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() diff --git a/edxp-core/template_override/common/util_functions.sh b/edxp-core/template_override/common/util_functions.sh index 425d0143..56eeb124 100644 --- a/edxp-core/template_override/common/util_functions.sh +++ b/edxp-core/template_override/common/util_functions.sh @@ -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` diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/entry/Router.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/entry/Router.java index 20feee6e..2f6b06ee 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/entry/Router.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/entry/Router.java @@ -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); diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/BlackWhiteListProxy.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/BlackWhiteListProxy.java index fd565e66..02b1feda 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/BlackWhiteListProxy.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/BlackWhiteListProxy.java @@ -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) { diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/NormalProxy.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/NormalProxy.java index f63052d9..476977ae 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/NormalProxy.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/proxy/NormalProxy.java @@ -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(); } } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/entry/Router.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/entry/Router.java index 58bce36f..79753847 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/entry/Router.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/entry/Router.java @@ -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())); diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/BlackWhiteListProxy.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/BlackWhiteListProxy.java index 1e290d81..ea9fa7b5 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/BlackWhiteListProxy.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/BlackWhiteListProxy.java @@ -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) { diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/NormalProxy.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/NormalProxy.java index 73756752..2327c6be 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/NormalProxy.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/proxy/NormalProxy.java @@ -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(); } } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/entry/Router.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/entry/Router.java index 6f4f5f17..ee5ae5bf 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/entry/Router.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/entry/Router.java @@ -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(); } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/BlackWhiteListProxy.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/BlackWhiteListProxy.java index 5beb56ab..5f2578c7 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/BlackWhiteListProxy.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/BlackWhiteListProxy.java @@ -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) { diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/NormalProxy.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/NormalProxy.java index 4fad6cdb..c0bfcbf7 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/NormalProxy.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/proxy/NormalProxy.java @@ -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(); } } diff --git a/hiddenapi-stubs/libs/framework-stub.jar b/hiddenapi-stubs/libs/framework-stub.jar index ec5fe4432a9600756b54d3fc067828a1c07f59e2..7688f4fd68a3aa79272db201768b8967e09e46fa 100644 GIT binary patch delta 1731 zcmaJ>Z)jUp6u#eEFn%9@bB+ZgEZ93hCh_0-(T0aa#DNU8mwMmzD zHc+;84E*3$hzF@Mm4O4<6wzf!*;u#vN$NV7A2ykS;-|uF5mBLn)^l!?l=ligc=vG6 zIltdMzjN+;XQ$3i+4_2vDhp%Vwy{T73N}>SABx?GSC*eLC-zk9{r9Tv4);O_H5TxySHTI8IH5 z)vzG0i}HcvjIqJ7^s&rHI^5T@nN5wv5R+-a$F^Z`wX>D|AE7Oy2D4cM5>7_Bv@}LKzE&Y3+T|BCnN;{H}Ku71Ldme6a;ODRkS^ElK4)H%lAyBKn?7R zHMAI&Ix8&H!uw{}=W@YvOf=|=1eYxq;nA8JV5viJCb;wmjPG$kB%umA^>*utBUsQR zjwN29BPGw&BG?P7_Qp~{a2U}N+>5#4r??pwJ+>_phku;Cny+T8e+Oee9otAfu{lFS zM+b8`eLLaPIG25m7}shIk;52y$|FRai}RFGzqN7%>HnQ?PCAn_3>kjt;Bs>_taXV0 zz%1@QejGmQc#(>1`CcstEi$e{IZd_5Ol(Yl$h-22p```#BeC&*fIk`m%lL_L+POg zt@{wvMuM+nZJoPt$KlVe9bRK!>&qzdY1TtF*|H@^PkjJ$oUo*t;Z9N%`7p_)>5|h9 zO`XE2b#m!O$?1iBr)}d3uBBf9)IN(<@2{Lp+G|u8PdcEvEdt9M4B-fWX}yiH^x)Cs zBX9iguxcw*q}`8QErD|R+{CbP&~PEbK^|7-;R>yLU61 uo*W&`8)|`T?OZ+*gzwwqLgdu?+BY#2xr{H?UwJOhghKF-5`e!_uKxg)S)rl; delta 1622 zcmZWpZ)jUp6u)_|OWNeEi(PqZ>TUa)w#i-_nl@?Dv{@-Zi~ED2bB-~c#ky8mr%h=3 zPjuZf`oZDq2uJY4Nc|FI2u@t2$YitbgCLH6+yqfpKPkF82371|)_S&5ViLr}z#(ao2oXsK zpfS#+FJ;&hf10qD(OZ|{W<2nidJ=^3m$$)OJVK~o7k{zI!Pw~J*i`C-HDx|YLQt1@ zlt-2^H@lm7?lIPAI&Bs6aTk{|4!G7O&c|K!&Q-yGQUmPnRz@}p=FDzW<{?*E&+*jc z^!VhoCA*ou)5M-}!3De8VVXid`TX31O|~(14c~zhp0Psq65$7-u19qEOo&VN?HKXG zYN$pdp)+UKK59kUZG1x}s%r-V+u{FiRRC$t=v8eANWD7khV`%tm0?8y{ol4NOklPd zL`Oq7LGXmskzMh@JS-*kZXf=V-HIRtVg@UynF14yiX@ZeDXSL<%O@z5LxJy)C z4!4M;3(x-D*Nm0_z*jdVz2HHh1_N#vq4kP=)zW{!=fq?s3+@v9Rdd zDO9q~g_5g1HAk%j#yvcGs2vwu$^%Yio|x@xD-FX#Sl5m1X)<_d3)$~l;G4!~qvquZ zm-e>7%?SOTAQ9#28p=GLvR*I9#<=Z1EXOp$t;V?2;)h>iyUDBU~ zNoj|iw#zzJ+CZWmY+D=XK<^#$IE=>x^Byt}1&9f4y*os~cdHIM_o6Z