diff --git a/edxp-common/template_override/system/lib/libwhale.edxp.so b/edxp-common/template_override/system/lib/libwhale.edxp.so index 187d0495..d718e9aa 100755 Binary files a/edxp-common/template_override/system/lib/libwhale.edxp.so and b/edxp-common/template_override/system/lib/libwhale.edxp.so differ diff --git a/edxp-common/template_override/system/lib64/libwhale.edxp.so b/edxp-common/template_override/system/lib64/libwhale.edxp.so index 3c2cd0d8..ccd342dc 100755 Binary files a/edxp-common/template_override/system/lib64/libwhale.edxp.so and b/edxp-common/template_override/system/lib64/libwhale.edxp.so differ diff --git a/edxp-common/template_override/system_x86/lib/libwhale.edxp.so b/edxp-common/template_override/system_x86/lib/libwhale.edxp.so index d1653bcc..618b2f4b 100755 Binary files a/edxp-common/template_override/system_x86/lib/libwhale.edxp.so and b/edxp-common/template_override/system_x86/lib/libwhale.edxp.so differ diff --git a/edxp-common/template_override/system_x86/lib64/libwhale.edxp.so b/edxp-common/template_override/system_x86/lib64/libwhale.edxp.so index f5bcdc5a..0f7c1eda 100755 Binary files a/edxp-common/template_override/system_x86/lib64/libwhale.edxp.so and b/edxp-common/template_override/system_x86/lib64/libwhale.edxp.so differ diff --git a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java index 2a9eb1d3..5c1904a1 100644 --- a/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java +++ b/edxp-whale/src/main/java/com/elderdrivers/riru/edxp/whale/config/WhaleHookProvider.java @@ -5,6 +5,8 @@ import com.elderdrivers.riru.edxp.config.BaseHookProvider; import com.lody.whale.WhaleRuntime; import java.lang.reflect.Member; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map; @@ -23,6 +25,7 @@ public class WhaleHookProvider extends BaseHookProvider { @Override public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) { + resolveStaticMethod(method); long slot = WhaleRuntime.hookMethodNative(method.getDeclaringClass(), method, additionalInfo); synchronized (sHookedMethodSlotMap) { sHookedMethodSlotMap.put(method, slot); @@ -64,4 +67,27 @@ public class WhaleHookProvider extends BaseHookProvider { public boolean removeFinalFlagNative(Class clazz) { return Main.removeFinalFlagNative(clazz); } + + + /** + * the static method is lazy resolved, when not resolved, the entry point is a trampoline of + * a bridge, we can not hook these entry. this method force the static method to be resolved. + */ + public static void resolveStaticMethod(Member method) { + //ignore result, just call to trigger resolve + if (method == null) + return; + try { + if (method instanceof Method && Modifier.isStatic(method.getModifiers())) { + ((Method) method).setAccessible(true); + ((Method) method).invoke(new Object(), getFakeArgs((Method) method)); + } + } catch (Exception ignored) { + // we should never make a successful call. + } + } + + private static Object[] getFakeArgs(Method method) { + return method.getParameterTypes().length == 0 ? new Object[]{new Object()} : null; + } }