diff --git a/Core/jni/main/inject/config_manager.cpp b/Core/jni/main/inject/config_manager.cpp index b8447eeb..5af64060 100644 --- a/Core/jni/main/inject/config_manager.cpp +++ b/Core/jni/main/inject/config_manager.cpp @@ -27,10 +27,12 @@ static char whitelist_path[PATH_MAX]; 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 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 inited = false; static const char *get_installer_package_name() { @@ -72,8 +74,11 @@ static void init_once() { installer_package_name, "blackwhitelist"); snprintf(dynamic_modules_path, PATH_MAX, config_path_tpl, data_path_prefix, installer_package_name, "dynamicmodules"); + snprintf(deopt_boot_image_path, PATH_MAX, config_path_tpl, data_path_prefix, + installer_package_name, "deoptbootimage"); dynamic_modules_enabled = access(dynamic_modules_path, F_OK) == 0; black_white_list_enabled = access(black_white_list_path, F_OK) == 0; + deopt_boot_image_enabled = access(deopt_boot_image_path, F_OK) == 0; LOGI("black/white list mode: %d", black_white_list_enabled); LOGI("dynamic modules mode: %d", dynamic_modules_enabled); inited = true; @@ -136,7 +141,12 @@ bool is_dynamic_modules_enabled() { return dynamic_modules_enabled; } -jstring get_installer_pkg_name(JNIEnv *env, jclass clazz) { +bool is_deopt_boot_image_enabled() { + init_once(); + return deopt_boot_image_enabled; +} + +jstring get_installer_pkg_name(JNIEnv *env, jclass) { init_once(); return env->NewStringUTF(installer_package_name); } diff --git a/Core/jni/main/inject/config_manager.h b/Core/jni/main/inject/config_manager.h index 8bd831c7..8fb59259 100644 --- a/Core/jni/main/inject/config_manager.h +++ b/Core/jni/main/inject/config_manager.h @@ -5,12 +5,16 @@ #ifndef EDXPOSED_CONFIG_MANAGER_H #define EDXPOSED_CONFIG_MANAGER_H +#include + bool is_app_need_hook(JNIEnv *env, jstring appDataDir); bool is_black_white_list_enabled(); bool is_dynamic_modules_enabled(); +bool is_deopt_boot_image_enabled(); + jstring get_installer_pkg_name(JNIEnv *env, jclass clazz); #endif //EDXPOSED_CONFIG_MANAGER_H diff --git a/Core/jni/main/native_hook/native_hook.cpp b/Core/jni/main/native_hook/native_hook.cpp index 5a2b9808..3bb3fb11 100644 --- a/Core/jni/main/native_hook/native_hook.cpp +++ b/Core/jni/main/native_hook/native_hook.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include "include/logging.h" #include "native_hook.h" @@ -182,6 +183,9 @@ void deoptimize_method(JNIEnv *env, jclass clazz, jobject method) { } void hookRuntime(int api_level, void *artHandle, void (*hookFun)(void *, void *, void **)) { + if (!is_deopt_boot_image_enabled()) { + return; + } void *runtimeInitSym = nullptr; if (api_level >= ANDROID_O) { // only oreo has deoptBootImageSym in Runtime