From 641ed369faca7416904e7c250b4cf7a4c4135740 Mon Sep 17 00:00:00 2001 From: Nullptr <52071314+Dr-TSNG@users.noreply.github.com> Date: Fri, 27 May 2022 23:01:06 +0800 Subject: [PATCH] Fix module not loading on first run --- core | 2 +- .../lspatch/loader/LSPApplication.java | 3 ++- .../src/main/jni/src/patch_loader.cpp | 19 ++++++++++++------- patch-loader/src/main/jni/src/patch_loader.h | 4 +++- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core b/core index dd8dcfb..d36d284 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit dd8dcfbab1d8aa8a408ab57cb5e934684679533d +Subproject commit d36d284f3908e7f5eb8bcb873e637cac2db27b01 diff --git a/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java b/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java index c92d1cd..4fd9863 100644 --- a/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java +++ b/patch-loader/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java @@ -93,10 +93,11 @@ public class LSPApplication { try { disableProfile(context); Startup.initXposed(false, ActivityThread.currentProcessName(), service); - Log.i(TAG, "Start loading modules"); + Log.i(TAG, "Bootstrap Xposed"); Startup.bootstrapXposed(); // WARN: Since it uses `XResource`, the following class should not be initialized // before forkPostCommon is invoke. Otherwise, you will get failure of XResources + Log.i(TAG, "Load modules"); LSPLoader.initModules(appLoadedApk); Log.i(TAG, "Modules initialized"); diff --git a/patch-loader/src/main/jni/src/patch_loader.cpp b/patch-loader/src/main/jni/src/patch_loader.cpp index 28c8a9a..6bb5943 100644 --- a/patch-loader/src/main/jni/src/patch_loader.cpp +++ b/patch-loader/src/main/jni/src/patch_loader.cpp @@ -71,11 +71,15 @@ namespace lspd { env->DeleteLocalRef(dex_buffer); } - void PatchLoader::InitHooks(JNIEnv* env, const lsplant::InitInfo& initInfo) { + void PatchLoader::InitArtHooker(JNIEnv* env, const InitInfo& initInfo) { + Context::InitArtHooker(env, initInfo); handler = initInfo; - Context::InitHooks(env, handler); - art::DisableInline(handler); - art::DisableBackgroundVerification(handler); + art::DisableInline(initInfo); + art::DisableBackgroundVerification(initInfo); + } + + void PatchLoader::InitHooks(JNIEnv* env) { + Context::InitHooks(env); RegisterBypass(env); } @@ -88,7 +92,7 @@ namespace lspd { void PatchLoader::Load(JNIEnv* env) { InitSymbolCache(nullptr); - lsplant::InitInfo initInfo{ + lsplant::InitInfo initInfo { .inline_hooker = [](auto t, auto r) { void* bk = nullptr; return HookFunction(t, r, &bk) == RS_SUCCESS ? bk : nullptr; @@ -108,10 +112,11 @@ namespace lspd { auto dex_field = JNI_GetStaticFieldID(env, stub, "dex", "[B"); auto array = (jbyteArray) env->GetStaticObjectField(stub, dex_field); - auto dex = PreloadedDex{env->GetByteArrayElements(array, nullptr), static_cast(JNI_GetArrayLength(env, array))}; + auto dex = PreloadedDex {env->GetByteArrayElements(array, nullptr), static_cast(JNI_GetArrayLength(env, array))}; + InitArtHooker(env, initInfo); LoadDex(env, std::move(dex)); - InitHooks(env, initInfo); + InitHooks(env); GetArt(true); diff --git a/patch-loader/src/main/jni/src/patch_loader.h b/patch-loader/src/main/jni/src/patch_loader.h index 56fcd40..9f75ab9 100644 --- a/patch-loader/src/main/jni/src/patch_loader.h +++ b/patch-loader/src/main/jni/src/patch_loader.h @@ -42,7 +42,9 @@ namespace lspd { void Load(JNIEnv* env); protected: - void InitHooks(JNIEnv* env, const lsplant::InitInfo& initInfo) override; + void InitArtHooker(JNIEnv* env, const lsplant::InitInfo& initInfo) override; + + void InitHooks(JNIEnv* env) override; void LoadDex(JNIEnv* env, PreloadedDex&& dex) override;