From 06c65a5a61fc0e90c4e0a8680d13bbc8f78b3b94 Mon Sep 17 00:00:00 2001 From: LoveSy Date: Tue, 3 Jan 2023 21:14:43 +0800 Subject: [PATCH] Implement deoptimize --- .../org/lsposed/lspd/impl/LSPosedContext.java | 25 +++++++++++++------ .../libxposed/XposedContextWrapper.java | 4 +-- .../io/github/libxposed/XposedInterface.java | 4 +-- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java b/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java index 4d4cf6ee..c4909eb5 100644 --- a/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java +++ b/core/src/main/java/org/lsposed/lspd/impl/LSPosedContext.java @@ -38,6 +38,7 @@ import androidx.annotation.Nullable; import org.lsposed.lspd.core.BuildConfig; import org.lsposed.lspd.models.Module; +import org.lsposed.lspd.nativebridge.HookBridge; import org.lsposed.lspd.service.ILSPInjectedModuleService; import org.lsposed.lspd.util.LspModuleClassLoader; @@ -47,7 +48,10 @@ import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.InputStream; import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Proxy; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -822,16 +826,23 @@ public class LSPosedContext extends XposedContext { return null; } - // TODO - @Override - public boolean deoptimize(@Nullable Method method) { - return false; + private static boolean deoptimize(@NonNull Executable method) { + if (Modifier.isAbstract(method.getModifiers())) { + throw new IllegalArgumentException("Cannot deoptimize abstract methods: " + method); + } else if (Proxy.isProxyClass(method.getDeclaringClass())) { + throw new IllegalArgumentException("Cannot deoptimize methods from proxy class: " + method); + } + return HookBridge.deoptimizeMethod(method); } - // TODO @Override - public boolean deoptimize(@Nullable Constructor constructor) { - return false; + public boolean deoptimize(@NonNull Method method) { + return deoptimize((Executable) method); + } + + @Override + public boolean deoptimize(@NonNull Constructor constructor) { + return deoptimize((Executable) constructor); } // TODO diff --git a/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java b/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java index 87ce9c37..e69b6582 100644 --- a/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java +++ b/libxposed/api/src/main/java/io/github/libxposed/XposedContextWrapper.java @@ -106,12 +106,12 @@ public class XposedContextWrapper extends ContextWrapper implements XposedInterf } @Override - public boolean deoptimize(@Nullable Method method) { + public boolean deoptimize(@NonNull Method method) { return getBaseContext().deoptimize(method); } @Override - public boolean deoptimize(@Nullable Constructor constructor) { + public boolean deoptimize(@NonNull Constructor constructor) { return getBaseContext().deoptimize(constructor); } diff --git a/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java b/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java index fb5997d9..6f9a05cb 100644 --- a/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java +++ b/libxposed/api/src/main/java/io/github/libxposed/XposedInterface.java @@ -112,9 +112,9 @@ public interface XposedInterface { MethodUnhooker>, Constructor> hook(@NonNull Constructor origin, int priority, @NonNull MethodHooker> hooker); - boolean deoptimize(@Nullable Method method); + boolean deoptimize(@NonNull Method method); - boolean deoptimize(@Nullable Constructor constructor); + boolean deoptimize(@NonNull Constructor constructor); @Nullable XposedUtils getUtils();