diff --git a/app/build.gradle.kts b/app/build.gradle.kts index af3f4190..7a22d9b4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -17,7 +17,6 @@ * Copyright (C) 2021 LSPosed Contributors */ -import com.android.build.gradle.internal.dsl.BuildType import java.time.Instant plugins { @@ -78,7 +77,7 @@ android { signingConfig = if (it.storeFile?.exists() == true) it else signingConfigs.named("debug").get() isMinifyEnabled = true - (this as BuildType).isShrinkResources = true + isShrinkResources = true proguardFiles("proguard-rules.pro") } } @@ -101,12 +100,6 @@ autoResConfig { } materialThemeBuilder { -// fun Theme.emplace() { -// lightThemeFormat.set("ThemeOverlay.Light.%s") -// darkThemeFormat.set("ThemeOverlay.Dark.%s") -// -// themes.add(this) -// } themes { for ((name, color) in listOf( "Red" to "F44336", diff --git a/core/src/main/jni/include/art/runtime/hidden_api.h b/core/src/main/jni/include/art/runtime/hidden_api.h index 813878d8..f25c814c 100644 --- a/core/src/main/jni/include/art/runtime/hidden_api.h +++ b/core/src/main/jni/include/art/runtime/hidden_api.h @@ -28,13 +28,15 @@ namespace art { namespace hidden_api { + inline static bool is_debuggable = false; + using lsplant::operator""_tstr; CREATE_FUNC_SYMBOL_ENTRY(void, DexFile_setTrusted, JNIEnv *env, jclass clazz, jobject j_cookie) { if (DexFile_setTrustedSym != nullptr) [[likely]] { - Runtime::Current()->SetJavaDebuggable(true); + if (!is_debuggable) Runtime::Current()->SetJavaDebuggable(true); DexFile_setTrustedSym(env, clazz, j_cookie); - Runtime::Current()->SetJavaDebuggable(false); + if (!is_debuggable) Runtime::Current()->SetJavaDebuggable(false); } } @@ -115,12 +117,20 @@ namespace art { } ); - inline void DisableHiddenApi(const lsplant::HookHandler &handler) { - + inline void DisableHiddenApi(JNIEnv* env, const lsplant::HookHandler &handler) { const int api_level = lspd::GetAndroidApiLevel(); if (api_level < __ANDROID_API_P__) { return; } + + auto runtime_class = lsplant::JNI_FindClass(env, "dalvik/system/VMRuntime"); + auto get_runtime_method = lsplant::JNI_GetStaticMethodID(env, runtime_class, "getRuntime", "()Ldalvik/system/VMRuntime;"); + auto is_debuggable_method = lsplant::JNI_GetMethodID(env, runtime_class, "isJavaDebuggable", "()Z"); + auto runtime = lsplant::JNI_CallStaticObjectMethod(env, runtime_class, get_runtime_method); + is_debuggable = lsplant::JNI_CallBooleanMethod(env, runtime, is_debuggable_method); + + LOGD("java runtime debuggable %s", is_debuggable ? "true" : "false"); + DexFile_setTrustedSym = reinterpret_cast(lspd::symbol_cache->setTrusted); lsplant::HookSymNoHandle(handler, lspd::symbol_cache->openDexFileNative, DexFile_openDexFileNative); lsplant::HookSymNoHandle(handler, lspd::symbol_cache->openInMemoryDexFilesNative, diff --git a/core/src/main/jni/include/native_hook.h b/core/src/main/jni/include/native_hook.h index 9208d517..1157fa40 100644 --- a/core/src/main/jni/include/native_hook.h +++ b/core/src/main/jni/include/native_hook.h @@ -23,6 +23,6 @@ #include "utils/hook_helper.hpp" namespace lspd { - void InstallInlineHooks(const lsplant::HookHandler &handler); + void InstallInlineHooks(JNIEnv* env, const lsplant::HookHandler &handler); } diff --git a/core/src/main/jni/src/jni/hook_bridge.cpp b/core/src/main/jni/src/jni/hook_bridge.cpp index de4ccc02..456c49a4 100644 --- a/core/src/main/jni/src/jni/hook_bridge.cpp +++ b/core/src/main/jni/src/jni/hook_bridge.cpp @@ -14,8 +14,7 @@ * You should have received a copy of the GNU General Public License * along with LSPosed. If not, see . * - * Copyright (C) 2020 EdXposed Contributors - * Copyright (C) 2021 LSPosed Contributors + * Copyright (C) 2022 LSPosed Contributors */ #include "hook_bridge.h" diff --git a/core/src/main/jni/src/native_hook.cpp b/core/src/main/jni/src/native_hook.cpp index d480f103..fa98005a 100644 --- a/core/src/main/jni/src/native_hook.cpp +++ b/core/src/main/jni/src/native_hook.cpp @@ -31,14 +31,14 @@ namespace lspd { static std::atomic_bool installed = false; - void InstallInlineHooks(const lsplant::HookHandler& handler) { + void InstallInlineHooks(JNIEnv* env, const lsplant::HookHandler& handler) { if (installed.exchange(true)) [[unlikely]] { LOGD("Inline hooks have been installed, skip"); return; } LOGD("Start to install inline hooks"); art::Runtime::Setup(handler); - art::hidden_api::DisableHiddenApi(handler); + art::hidden_api::DisableHiddenApi(env, handler); LOGD("Inline hooks installed"); } } // namespace lspd diff --git a/daemon/build.gradle.kts b/daemon/build.gradle.kts index 9f27dd91..cf879bab 100644 --- a/daemon/build.gradle.kts +++ b/daemon/build.gradle.kts @@ -64,6 +64,7 @@ android { } release { isMinifyEnabled = true + isShrinkResources = true proguardFiles("proguard-rules.pro") } } diff --git a/external/lsplant b/external/lsplant index eb00b31d..3d2e1f5f 160000 --- a/external/lsplant +++ b/external/lsplant @@ -1 +1 @@ -Subproject commit eb00b31d2591a4f46098c6d94161f3b872721881 +Subproject commit 3d2e1f5fc73ae09ebe889f2c6ddfc49c57dda2c9 diff --git a/hiddenapi/stubs/src/main/java/dalvik/system/VMRuntime.java b/hiddenapi/stubs/src/main/java/dalvik/system/VMRuntime.java index e578e8c4..692b4569 100644 --- a/hiddenapi/stubs/src/main/java/dalvik/system/VMRuntime.java +++ b/hiddenapi/stubs/src/main/java/dalvik/system/VMRuntime.java @@ -10,4 +10,6 @@ public class VMRuntime { public native boolean is64Bit(); public native String vmInstructionSet(); + + public native boolean isJavaDebuggable(); } diff --git a/magisk-loader/src/main/jni/src/magisk_loader.cpp b/magisk-loader/src/main/jni/src/magisk_loader.cpp index 8801a32f..60fdfe36 100644 --- a/magisk-loader/src/main/jni/src/magisk_loader.cpp +++ b/magisk-loader/src/main/jni/src/magisk_loader.cpp @@ -122,7 +122,7 @@ namespace lspd { return GetArt()->getSymbAddress(symbol); }, }; - InstallInlineHooks(initInfo); + InstallInlineHooks(env, initInfo); InitHooks(env, initInfo); SetupEntryClass(env); FindAndCall(env, "forkCommon", @@ -194,7 +194,7 @@ namespace lspd { return GetArt()->getSymbAddress(symbol); }, }; - InstallInlineHooks(initInfo); + InstallInlineHooks(env, initInfo); auto [dex_fd, size] = instance->RequestLSPDex(env, binder); LoadDex(env, PreloadedDex(dex_fd, size)); close(dex_fd); diff --git a/settings.gradle.kts b/settings.gradle.kts index 5a0963c0..a3503865 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -12,7 +12,7 @@ pluginManagement { id("com.android.library") version agpVersion id("com.android.application") version agpVersion id("androidx.navigation.safeargs") version navVersion - id("dev.rikka.tools.autoresconfig") version "1.1.0" + id("dev.rikka.tools.autoresconfig") version "1.1.1" id("dev.rikka.tools.materialthemebuilder") version "1.1.0" } }