From 347675de661873c7ec5ca74421ee850a73c556ab Mon Sep 17 00:00:00 2001 From: ACh Sulfate Date: Sat, 15 Jul 2023 21:53:50 +0800 Subject: [PATCH] fix: NtStartupDirector not found on NT 4288 --- .../java/io/github/qauxv/util/Initiator.java | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/github/qauxv/util/Initiator.java b/app/src/main/java/io/github/qauxv/util/Initiator.java index bcf2da2e3f..2e956cd7e9 100644 --- a/app/src/main/java/io/github/qauxv/util/Initiator.java +++ b/app/src/main/java/io/github/qauxv/util/Initiator.java @@ -25,6 +25,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.tencent.mobileqq.app.QQAppInterface; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.HashMap; import mqq.app.AppRuntime; @@ -217,12 +219,50 @@ public static Class _StartupDirector() { return findClassWithSynthetics("com/tencent/mobileqq/startup/director/StartupDirector", 1); } + private static Class skNtStartupDirector = null; + private static boolean sNotHaveNtStartupDirector = false; + public static Class _NtStartupDirector() { - Class klass = Initiator.load("com.tencent.mobileqq.startup.director.a"); - if (klass == _StartupDirector()) { + if (skNtStartupDirector != null) { + return skNtStartupDirector; + } + if (sNotHaveNtStartupDirector) { return null; } - return klass; + String[] candidates = new String[]{ + "com.tencent.mobileqq.startup.director.a", + "com.tencent.mobileqq.g3.a.a" + }; + for (String candidate : candidates) { + Class klass = load(candidate); + if (isNtStartupDirector(klass)) { + skNtStartupDirector = klass; + return klass; + } + } + sNotHaveNtStartupDirector = true; + return null; + } + + private static boolean isNtStartupDirector(Class klass) { + if (klass == null || klass == _StartupDirector()) { + return false; + } + if (!android.os.Handler.Callback.class.isAssignableFrom(klass)) { + return false; + } + // have a static instance field + boolean hasStaticInstance = false; + for (Field field : klass.getDeclaredFields()) { + if (Modifier.isStatic(field.getModifiers()) && field.getType() == klass) { + hasStaticInstance = true; + break; + } + } + if (!hasStaticInstance) { + return false; + } + return true; } public static Class _BaseQQMessageFacade() {