From 83ecd3ae97bfc3080c77b5a2b24e5f1404c5c4a7 Mon Sep 17 00:00:00 2001 From: solohsu Date: Thu, 16 May 2019 21:45:15 +0800 Subject: [PATCH] Deoptimize resources hook related methods only if needed For now deoptimization is only done on MIUI with resources hooking enabled. --- .../riru/edxp/deopt/InlinedMethodCallers.java | 4 ++++ .../edxp/deopt/PrebuiltMethodsDeopter.java | 8 +++++++ .../elderdrivers/riru/edxp/util/Utils.java | 7 ++++++ edxp-core/build.gradle | 4 ++-- edxp-core/jni/main/inject/config_manager.cpp | 11 +++++++++ edxp-core/jni/main/inject/config_manager.h | 2 ++ edxp-core/jni/main/java_hook/java_hook.cpp | 3 +++ .../common/util_functions.sh | 2 +- .../java/com/elderdrivers/riru/edxp/Main.java | 2 ++ .../sandhook/config/SandHookEdxpConfig.java | 9 ++++++-- .../java/com/elderdrivers/riru/edxp/Main.java | 2 ++ .../edxp/whale/config/WhaleEdxpConfig.java | 9 ++++++-- .../java/com/elderdrivers/riru/edxp/Main.java | 2 ++ .../edxp/yahfa/config/YahfaEdxpConfig.java | 9 ++++++-- hiddenapi-stubs/libs/framework-stub.jar | Bin 15372 -> 15372 bytes .../riru/edxp/config/EdXpConfig.java | 3 ++- .../riru/edxp/config/EdXpConfigGlobal.java | 21 +----------------- .../de/robv/android/xposed/XposedBridge.java | 8 +------ .../de/robv/android/xposed/XposedInit.java | 13 ++--------- 19 files changed, 71 insertions(+), 48 deletions(-) diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/InlinedMethodCallers.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/InlinedMethodCallers.java index f2a47671..daf891b5 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/InlinedMethodCallers.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/InlinedMethodCallers.java @@ -13,6 +13,7 @@ import java.util.HashMap; public class InlinedMethodCallers { public static final String KEY_BOOT_IMAGE = "boot_image"; + public static final String KEY_BOOT_IMAGE_MIUI_RES = "boot_image_miui_res"; public static final String KEY_SYSTEM_SERVER = "system_server"; /** @@ -27,7 +28,9 @@ public class InlinedMethodCallers { private static final String[][] BOOT_IMAGE = { // callers of Application#attach(Context) {"android.app.Instrumentation", "newApplication", "(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;"}, + }; + private static final String[][] BOOT_IMAGE_FOR_MIUI_RES = { // for MIUI resources hooking {"android.content.res.MiuiResources", "init", "(Ljava/lang/String;)V"}, {"android.content.res.MiuiResources", "updateMiuiImpl", "()V"}, @@ -50,6 +53,7 @@ public class InlinedMethodCallers { static { CALLERS.put(KEY_BOOT_IMAGE, BOOT_IMAGE); + CALLERS.put(KEY_BOOT_IMAGE_MIUI_RES, BOOT_IMAGE_FOR_MIUI_RES); CALLERS.put(KEY_SYSTEM_SERVER, SYSTEM_SERVER); CALLERS.put("com.android.systemui", SYSTEM_UI); } diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/PrebuiltMethodsDeopter.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/PrebuiltMethodsDeopter.java index 4fe9a165..cd217e61 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/PrebuiltMethodsDeopter.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/deopt/PrebuiltMethodsDeopter.java @@ -1,5 +1,7 @@ package com.elderdrivers.riru.edxp.deopt; +import android.text.TextUtils; + import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal; import com.elderdrivers.riru.edxp.util.Utils; @@ -8,6 +10,7 @@ import java.util.Arrays; import de.robv.android.xposed.XposedHelpers; import static com.elderdrivers.riru.edxp.deopt.InlinedMethodCallers.KEY_BOOT_IMAGE; +import static com.elderdrivers.riru.edxp.deopt.InlinedMethodCallers.KEY_BOOT_IMAGE_MIUI_RES; import static com.elderdrivers.riru.edxp.deopt.InlinedMethodCallers.KEY_SYSTEM_SERVER; public class PrebuiltMethodsDeopter { @@ -37,6 +40,11 @@ public class PrebuiltMethodsDeopter { public static void deoptBootMethods() { // todo check if has been done before deoptMethods(KEY_BOOT_IMAGE, null); + if (!TextUtils.isEmpty(Utils.getSysProp("ro.miui.ui.version.code")) + && EdXpConfigGlobal.getConfig().isResourcesHookEnabled()) { + //deopt these only for MIUI with resources hook enabled + deoptMethods(KEY_BOOT_IMAGE_MIUI_RES, null); + } } public static void deoptSystemServerMethods(ClassLoader sysCL) { diff --git a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/Utils.java b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/Utils.java index bb3598fb..7cfe7965 100644 --- a/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/Utils.java +++ b/edxp-common/src/main/java/com/elderdrivers/riru/edxp/util/Utils.java @@ -4,6 +4,8 @@ import android.util.Log; import com.elderdrivers.riru.edxp.BuildConfig; +import de.robv.android.xposed.XposedHelpers; + public class Utils { @@ -42,4 +44,9 @@ public class Utils { public static void logE(String msg, Throwable throwable) { Log.e(LOG_TAG, msg, throwable); } + + public static String getSysProp(String key) { + Class sysProps = XposedHelpers.findClassIfExists("android.os.SystemProperties", null); + return (String) XposedHelpers.callStaticMethod(sysProps, "get", key); + } } diff --git a/edxp-core/build.gradle b/edxp-core/build.gradle index e5fd72bb..4712604d 100644 --- a/edxp-core/build.gradle +++ b/edxp-core/build.gradle @@ -3,10 +3,10 @@ import org.gradle.internal.os.OperatingSystem apply plugin: 'com.android.library' -version "v0.4.2.1_beta" +version "v0.4.2.2_beta" ext { - versionCode = "4210" + versionCode = "4220" module_name = "EdXposed" jar_dest_dir = "${projectDir}/template_override/system/framework/" is_windows = OperatingSystem.current().isWindows() diff --git a/edxp-core/jni/main/inject/config_manager.cpp b/edxp-core/jni/main/inject/config_manager.cpp index f1e1074f..21fac981 100644 --- a/edxp-core/jni/main/inject/config_manager.cpp +++ b/edxp-core/jni/main/inject/config_manager.cpp @@ -34,11 +34,13 @@ static char use_whitelist_path[PATH_MAX]; static char black_white_list_path[PATH_MAX]; static char dynamic_modules_path[PATH_MAX]; static char deopt_boot_image_path[PATH_MAX]; +static char resources_hook_disable_path[PATH_MAX]; static const char *installer_package_name; static bool black_white_list_enabled = false; static bool dynamic_modules_enabled = false; static bool deopt_boot_image_enabled = false; +static bool resources_hook_enabled = true; static bool inited = false; // snapshot at boot static bool use_white_list_snapshot = false; @@ -115,14 +117,18 @@ static void init_once() { installer_package_name, "dynamicmodules"); snprintf(deopt_boot_image_path, PATH_MAX, config_path_tpl, data_path_prefix, installer_package_name, "deoptbootimage"); + snprintf(resources_hook_disable_path, PATH_MAX, config_path_tpl, data_path_prefix, + installer_package_name, "disable_resources"); dynamic_modules_enabled = access(dynamic_modules_path, F_OK) == 0; black_white_list_enabled = access(black_white_list_path, F_OK) == 0; // use_white_list snapshot use_white_list_snapshot = access(use_whitelist_path, F_OK) == 0; deopt_boot_image_enabled = access(deopt_boot_image_path, F_OK) == 0; + resources_hook_enabled = access(resources_hook_disable_path, F_OK) != 0; LOGI("black/white list mode: %d, using whitelist: %d", black_white_list_enabled, use_white_list_snapshot); LOGI("dynamic modules mode: %d", dynamic_modules_enabled); + LOGI("resources hook: %d", resources_hook_enabled); if (black_white_list_enabled) { snapshotBlackWhiteList(); } @@ -200,6 +206,11 @@ bool is_dynamic_modules_enabled() { return dynamic_modules_enabled; } +bool is_resources_hook_enabled() { + init_once(); + return resources_hook_enabled; +} + bool is_deopt_boot_image_enabled() { init_once(); return deopt_boot_image_enabled; diff --git a/edxp-core/jni/main/inject/config_manager.h b/edxp-core/jni/main/inject/config_manager.h index a5349b3c..7cf72141 100644 --- a/edxp-core/jni/main/inject/config_manager.h +++ b/edxp-core/jni/main/inject/config_manager.h @@ -13,6 +13,8 @@ bool is_black_white_list_enabled(); bool is_dynamic_modules_enabled(); +bool is_resources_hook_enabled(); + bool is_deopt_boot_image_enabled(); jstring get_installer_pkg_name(JNIEnv *env, jclass clazz); diff --git a/edxp-core/jni/main/java_hook/java_hook.cpp b/edxp-core/jni/main/java_hook/java_hook.cpp index 26de4b9a..1b1f4792 100644 --- a/edxp-core/jni/main/java_hook/java_hook.cpp +++ b/edxp-core/jni/main/java_hook/java_hook.cpp @@ -116,6 +116,9 @@ static JNINativeMethod hookMethods[] = { { "isDynamicModulesEnabled", "()Z", (void *) is_dynamic_modules_enabled }, + { + "isResourcesHookEnabled", "()Z", (void *) is_resources_hook_enabled + }, { "isAppNeedHook", "(Ljava/lang/String;)Z", (void *) is_app_need_hook }, diff --git a/edxp-core/template_override/common/util_functions.sh b/edxp-core/template_override/common/util_functions.sh index d15a34ec..b8864e59 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.2.1_beta (4210)" +EDXP_VERSION="0.4.2.2_beta (4220)" 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/Main.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java index ffccbd73..37cd5493 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -151,4 +151,6 @@ public class Main implements KeepAll { public static native boolean initXResourcesNative(); public static native boolean removeFinalFlagNative(Class clazz); + + public static native boolean isResourcesHookEnabled(); } diff --git a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookEdxpConfig.java b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookEdxpConfig.java index c3a62805..35c08ebd 100644 --- a/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookEdxpConfig.java +++ b/edxp-sandhook/src/main/java/com/elderdrivers/riru/edxp/sandhook/config/SandHookEdxpConfig.java @@ -1,9 +1,9 @@ package com.elderdrivers.riru.edxp.sandhook.config; +import com.elderdrivers.riru.edxp.Main; import com.elderdrivers.riru.edxp.config.EdXpConfig; import com.elderdrivers.riru.edxp.config.InstallerChooser; -import com.elderdrivers.riru.edxp.Main; -import com.elderdrivers.riru.edxp.sandhook.entry.hooker.XposedBlackListHooker; +import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker; public class SandHookEdxpConfig implements EdXpConfig { @Override @@ -20,4 +20,9 @@ public class SandHookEdxpConfig implements EdXpConfig { public boolean isDynamicModulesMode() { return Main.isDynamicModulesEnabled(); } + + @Override + public boolean isResourcesHookEnabled() { + return Main.isResourcesHookEnabled(); + } } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java index 1f76a756..6fe810b9 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -142,4 +142,6 @@ public class Main implements KeepAll { public static native boolean initXResourcesNative(); public static native boolean removeFinalFlagNative(Class clazz); + + public static native boolean isResourcesHookEnabled(); } diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java index 3e5a2216..f68976e6 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleEdxpConfig.java @@ -1,9 +1,9 @@ package com.elderdrivers.riru.edxp.whale.config; +import com.elderdrivers.riru.edxp.Main; import com.elderdrivers.riru.edxp.config.EdXpConfig; import com.elderdrivers.riru.edxp.config.InstallerChooser; -import com.elderdrivers.riru.edxp.Main; -import com.elderdrivers.riru.edxp.whale.entry.hooker.XposedBlackListHooker; +import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker; public class WhaleEdxpConfig implements EdXpConfig { @Override @@ -20,4 +20,9 @@ public class WhaleEdxpConfig implements EdXpConfig { public boolean isDynamicModulesMode() { return Main.isDynamicModulesEnabled(); } + + @Override + public boolean isResourcesHookEnabled() { + return Main.isResourcesHookEnabled(); + } } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java index b0f6abeb..d94b3092 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/Main.java @@ -144,4 +144,6 @@ public class Main implements KeepAll { public static native boolean initXResourcesNative(); public static native boolean removeFinalFlagNative(Class clazz); + + public static native boolean isResourcesHookEnabled(); } diff --git a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaEdxpConfig.java b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaEdxpConfig.java index 352f0c05..4dc330cc 100644 --- a/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaEdxpConfig.java +++ b/edxp-yahfa/src/main/java/com/elderdrivers/riru/edxp/yahfa/config/YahfaEdxpConfig.java @@ -1,9 +1,9 @@ package com.elderdrivers.riru.edxp.yahfa.config; +import com.elderdrivers.riru.edxp.Main; import com.elderdrivers.riru.edxp.config.EdXpConfig; import com.elderdrivers.riru.edxp.config.InstallerChooser; -import com.elderdrivers.riru.edxp.Main; -import com.elderdrivers.riru.edxp.yahfa.entry.hooker.XposedBlackListHooker; +import com.elderdrivers.riru.edxp.hooker.XposedBlackListHooker; public class YahfaEdxpConfig implements EdXpConfig { @Override @@ -20,4 +20,9 @@ public class YahfaEdxpConfig implements EdXpConfig { public boolean isDynamicModulesMode() { return Main.isDynamicModulesEnabled(); } + + @Override + public boolean isResourcesHookEnabled() { + return Main.isResourcesHookEnabled(); + } } diff --git a/hiddenapi-stubs/libs/framework-stub.jar b/hiddenapi-stubs/libs/framework-stub.jar index 7688f4fd68a3aa79272db201768b8967e09e46fa..e461d96f401c1f282c62314e301e1f557d51ec4e 100644 GIT binary patch delta 1760 zcmZWpUrbwN6u*C13vC%4Yz2DxQ)p>-y9$N2Q0R~l-P}e%a8aXkBsdx~akQ@dGn&p0 zUx>J+IS)Q85+8`s8QqpHBU`dfUVPAnJsDz5mJuIJG=sQgTb5|_eCOk~ySHC*Io$93 ze&_topWel}#kum~0lCB?2&JWhdhv3$+$&$Vf0yk%!VK6{5805qkJ;RqdRw9kcYr&N z1pMTPwI)QX7Kb5c1FItQWanGRe5*2ZWxa~{xd+m9a>F+z&oKx5S`uV7_p#|1Idb>R z5{KG$yw9P(m$egQWakYI8K}J?(@n6ZhTn*`K~CCfkMo;q%OCuonO!R;%Jg5|ULsv? zIKw^u`gzfZxrYQi68nRv1fLU$Q*E+P=nvD`;BBQSFMGSlE_k0O`;&K&qB?zB6ct`` zQN?i9)v-<31Lmls!VoZb(DMr?thgc+Vav71b)}o<#d1;FE$62LD{Wy4w%OK4_Rk*0 zIfF{a$KIPcIng#eP=GVBZ}up?UliP_4^mU{Q%2NKa((T78tcAb5(F=zwX>Z084{`r zzxCMi$v%?>VJ?|S#m9|dpfRRMS7q2AQwV(tUpHj96AL_31BpV%u^liQqjDh_R9}e~UH#zp{r!h1*n-*nJ5N_hro5u^na^`D>?}M5! zZ*-9cE}dyuz|Plt|ctw5k3{%v;#(;Tq~^9~DE3beptGBhZdNgr%s9eow1WMRNP# zUX;FGP}Z$T$9*vBt%I#@GaT;b&0=J2{6Sr$B@OHd7}NWnj=us}=s9He=Si&4O^p;P zS}y%>@xBV#PA3WdzEhEGe#pA2i&lZv(C-IvyM_S1e#lUuauZ7(e&k*eq$&q)nTqJ*~}5o7=>g-o&Kozs*fVbhWaL&4&$Sr3u)&HmzxA z19P_a#fMr6AGjggQ0#-ufz&F~&2{!o>Q)#-9c(c1#llzyqCydg-#Pd8#(RT1aC7eY z&hPj8{^l;sEX+9e4@ed}Av<=E`(K>TI|5S3awgxkPwM~r9E7dyd_QCjvVCRN>K6IS z2exm78nnDjaEa^(mkV|}+$|C*DVh;(M0lJg#EREBDR9-VDvt^d##wc*&#noCY(O<_ z0445O+2{CyV_?A*Dh^1G!KY zN4^{SQI#wPB3wd|lYAeQck}%-d5{DDmLGCpe!h*J^B10E+w$#eJTdrC;$~QrLLC0u zV{2*z1t}vq1hG!i`v;dgqy-2(Z_`mi~Z>323xx8cnEj89A_5VAB^Tt%Vy&O}2{) zf57C^Zcw^pt|+gypBlxert#mE&=pxa&s8J66$&n|9@P<~3ve^u0QV9$SZ}NTue~W??ph+X}&swSGyZ|ChsMh`^{CT)Sa*@ z{N7yZcqVIZHr!28v84sJk^w%n@8j{4$Khh~sf<|`Cr4XMw%td_aAwS`XBZyiRKKV( z{^$Py(OxP}`yk)jP*y_bcl%T4We2`k7#BDJp6_$=)}6E+u)lz>dQ>gaBz4g%)Ci23i; zeY5->GE8>6p`}BCO-({k=qtqzLQ+G=PmH|&$WB)4S}czMmR2KWbJ?kM*%ZLX3Kb6p zVO5FqsX|Xpo-iRZ6Pawf>`MrtDD~|sU8knU#&YIx;7XK=qhYumP4G--id)~uG1E