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 7688f4fd..e461d96f 100644 Binary files a/hiddenapi-stubs/libs/framework-stub.jar and b/hiddenapi-stubs/libs/framework-stub.jar differ diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfig.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfig.java index 9ec66244..39882a25 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfig.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfig.java @@ -2,11 +2,12 @@ package com.elderdrivers.riru.edxp.config; public interface EdXpConfig { - String getInstallerBaseDir(); String getBlackListModulePackageName(); boolean isDynamicModulesMode(); + boolean isResourcesHookEnabled(); + } diff --git a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java index 679920b5..0d94ae2d 100644 --- a/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java +++ b/xposed-bridge/src/main/java/com/elderdrivers/riru/edxp/config/EdXpConfigGlobal.java @@ -9,7 +9,7 @@ public class EdXpConfigGlobal { public static EdXpConfig getConfig() { if (sConfig == null) { - return defaultConfig; + throw new IllegalArgumentException("sConfig should not be null."); } return sConfig; } @@ -20,23 +20,4 @@ public class EdXpConfigGlobal { } return sHookProvider; } - - - private static final EdXpConfig defaultConfig = new EdXpConfig() { - - @Override - public String getInstallerBaseDir() { - return ""; - } - - @Override - public String getBlackListModulePackageName() { - return ""; - } - - @Override - public boolean isDynamicModulesMode() { - return false; - } - }; } diff --git a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedBridge.java b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedBridge.java index 3a4665e8..37cee9e9 100644 --- a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedBridge.java +++ b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedBridge.java @@ -90,15 +90,9 @@ public final class XposedBridge { public static volatile ClassLoader dummyClassLoader = null; public static void initXResources() { - if (disableHooks) { + if (!EdXpConfigGlobal.getConfig().isResourcesHookEnabled()) { return; } - String BASE_DIR = EdXpConfigGlobal.getConfig().getInstallerBaseDir(); - if (SELinuxHelper.getAppDataFileService().checkFileExists(BASE_DIR + "conf/disable_resources")) { - Log.w(TAG, "Found " + BASE_DIR + "conf/disable_resources, not hooking resources"); - XposedInit.disableResources = true; - return; - } if (dummyClassLoader != null) { return; } diff --git a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java index 9c8e0e05..19936fa8 100644 --- a/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java +++ b/xposed-bridge/src/main/java/de/robv/android/xposed/XposedInit.java @@ -56,7 +56,7 @@ public final class XposedInit { private static final String startClassName = ""; // ed: no support for tool process anymore private static final String INSTANT_RUN_CLASS = "com.android.tools.fd.runtime.BootstrapApplication"; - public static boolean disableResources = false; + public static volatile boolean disableResources = false; private static final String[] XRESOURCES_CONFLICTING_PACKAGES = {"com.sygic.aura"}; private XposedInit() { @@ -85,16 +85,7 @@ public final class XposedInit { } private static void hookResources() throws Throwable { - - if (disableResources) { - return; - } - - String BASE_DIR = EdXpConfigGlobal.getConfig().getInstallerBaseDir(); - - if (SELinuxHelper.getAppDataFileService().checkFileExists(BASE_DIR + "conf/disable_resources")) { - Log.w(TAG, "Found " + BASE_DIR + "conf/disable_resources, not hooking resources"); - disableResources = true; + if (!EdXpConfigGlobal.getConfig().isResourcesHookEnabled() || disableResources) { return; }