diff --git a/core/src/main/cpp/main/include/art/runtime/class_linker.h b/core/src/main/cpp/main/include/art/runtime/class_linker.h index d7d0efb4..1bdcb561 100644 --- a/core/src/main/cpp/main/include/art/runtime/class_linker.h +++ b/core/src/main/cpp/main/include/art/runtime/class_linker.h @@ -34,6 +34,7 @@ namespace art { LOGD("Pending hook for %p (%s)", clazz_ptr, art::mirror::Class(clazz_ptr).GetDescriptor().c_str()); lspd::Context::GetInstance()->CallOnPostFixupStaticTrampolines(clazz_ptr); + lspd::DonePendingHook(class_def); } } diff --git a/core/src/main/cpp/main/src/jni/pending_hooks.cpp b/core/src/main/cpp/main/src/jni/pending_hooks.cpp index 7ea97efe..e45b2844 100644 --- a/core/src/main/cpp/main/src/jni/pending_hooks.cpp +++ b/core/src/main/cpp/main/src/jni/pending_hooks.cpp @@ -10,15 +10,20 @@ #include "art/runtime/mirror/class.h" namespace lspd { + namespace { + std::unordered_set pending_classes_; - static std::unordered_set pending_classes_; - - static std::unordered_set hooked_methods_; + std::unordered_set hooked_methods_; + } bool IsClassPending(void *clazz) { return pending_classes_.count(clazz); } + void DonePendingHook(void *clazz) { + pending_classes_.erase(clazz); + } + static void PendingHooks_recordPendingMethodNative(JNI_START, jobject method_ref, jclass class_ref) { auto *class_ptr = art::Thread::Current().DecodeJObject(class_ref); auto *method = getArtMethod(env, method_ref); diff --git a/core/src/main/cpp/main/src/jni/pending_hooks.h b/core/src/main/cpp/main/src/jni/pending_hooks.h index 579b75e2..9fe2ae49 100644 --- a/core/src/main/cpp/main/src/jni/pending_hooks.h +++ b/core/src/main/cpp/main/src/jni/pending_hooks.h @@ -13,4 +13,6 @@ namespace lspd { void recordHooked(void* art_method); + void DonePendingHook(void *clazz); + } // namespace lspd diff --git a/core/src/main/java/de/robv/android/xposed/PendingHooks.java b/core/src/main/java/de/robv/android/xposed/PendingHooks.java index 9b04cd7f..b2e83516 100644 --- a/core/src/main/java/de/robv/android/xposed/PendingHooks.java +++ b/core/src/main/java/de/robv/android/xposed/PendingHooks.java @@ -18,6 +18,7 @@ public final class PendingHooks { for (Map.Entry hook : sPendingHooks.get(clazz).entrySet()) { hookMethodNative(hook.getKey(), clazz, 0, hook.getValue()); } + sPendingHooks.remove(clazz); } }