Pull out common codes
This commit is contained in:
parent
5e271ec3e5
commit
7c7928760a
|
|
@ -45,4 +45,9 @@ afterEvaluate {
|
|||
tasks.withType(JavaCompile) {
|
||||
options.compilerArgs.add("-Xbootclasspath/p:${projectDir.absolutePath}/libs/framework-stub.jar")
|
||||
}
|
||||
|
||||
task("copyCommonroperties", type: Copy) {
|
||||
from file("${projectDir}/template_override/")
|
||||
into file(templateRootPath)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
package com.elderdrivers.riru.edxp.config;
|
||||
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
|
||||
public abstract class BaseHookProvider implements HookProvider {
|
||||
|
||||
public Member findMethodNative(Member hookMethod) {
|
||||
return hookMethod;
|
||||
}
|
||||
|
||||
public long getMethodId(Member member) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Object findMethodNative(Class clazz, String methodName, String methodSig) {
|
||||
return null;
|
||||
}
|
||||
|
||||
public void deoptMethods(String packageName, ClassLoader classLoader) {
|
||||
PrebuiltMethodsDeopter.deoptMethods(packageName, classLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deoptMethodNative(Object method) {
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package com.elderdrivers.riru.edxp.yahfa.util;
|
||||
package com.elderdrivers.riru.edxp.deopt;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
|
|
@ -1,14 +1,14 @@
|
|||
package com.elderdrivers.riru.edxp.yahfa.util;
|
||||
package com.elderdrivers.riru.edxp.deopt;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.EdXpConfigGlobal;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.yahfa.util.InlinedMethodCallers.KEY_BOOT_IMAGE;
|
||||
import static com.elderdrivers.riru.edxp.yahfa.util.InlinedMethodCallers.KEY_SYSTEM_SERVER;
|
||||
import static com.elderdrivers.riru.edxp.deopt.InlinedMethodCallers.KEY_BOOT_IMAGE;
|
||||
import static com.elderdrivers.riru.edxp.deopt.InlinedMethodCallers.KEY_SYSTEM_SERVER;
|
||||
|
||||
public class PrebuiltMethodsDeopter {
|
||||
|
||||
|
|
@ -19,10 +19,10 @@ public class PrebuiltMethodsDeopter {
|
|||
}
|
||||
for (String[] caller : callers) {
|
||||
try {
|
||||
Object method = Main.findMethodNative(
|
||||
Object method = EdXpConfigGlobal.getHookProvider().findMethodNative(
|
||||
XposedHelpers.findClass(caller[0], cl), caller[1], caller[2]);
|
||||
if (method != null) {
|
||||
Main.deoptMethodNative(method);
|
||||
EdXpConfigGlobal.getHookProvider().deoptMethodNative(method);
|
||||
}
|
||||
} catch (Throwable throwable) {
|
||||
Utils.logE("error when deopting method: " + Arrays.toString(caller), throwable);
|
||||
|
|
@ -57,6 +57,7 @@ afterEvaluate {
|
|||
def myTemplatePath = "${projectDir}/template_override/"
|
||||
|
||||
task("makeAndCopy${variantNameCapped}", type: Jar, dependsOn: "assemble${variantNameCapped}") {
|
||||
dependsOn tasks.getByPath(":edxp-common:copyCommonroperties")
|
||||
from "${buildDir}/intermediates/dex/${variantNameLowered}/mergeDex${variantNameCapped}/out/"
|
||||
destinationDir file(myTemplatePath + "system/framework/")
|
||||
baseName "edxp"
|
||||
|
|
|
|||
|
|
@ -3,13 +3,12 @@ package com.elderdrivers.riru.edxp.sandhook.entry.hooker;
|
|||
import android.app.ActivityThread;
|
||||
|
||||
import com.elderdrivers.riru.common.KeepMembers;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
|
||||
import com.elderdrivers.riru.edxp.sandhook.util.PrebuiltMethodsDeopter;
|
||||
import com.swift.sandhook.SandHook;
|
||||
import com.swift.sandhook.annotation.HookClass;
|
||||
import com.swift.sandhook.annotation.HookMethod;
|
||||
import com.swift.sandhook.annotation.HookMethodBackup;
|
||||
import com.swift.sandhook.annotation.HookMode;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
|
|
|
|||
|
|
@ -3,11 +3,11 @@ package com.elderdrivers.riru.edxp.sandhook.proxy;
|
|||
import android.text.TextUtils;
|
||||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.util.ProcessUtils;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
|
||||
import com.elderdrivers.riru.edxp.sandhook.util.PrebuiltMethodsDeopter;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@ package com.elderdrivers.riru.edxp.sandhook.proxy;
|
|||
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.sandhook.entry.Router;
|
||||
import com.elderdrivers.riru.edxp.sandhook.util.PrebuiltMethodsDeopter;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.FileUtils.getDataPathPrefix;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,49 +0,0 @@
|
|||
package com.elderdrivers.riru.edxp.sandhook.util;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Providing a whitelist of methods which are the callers of the target methods we want to hook.
|
||||
* Because the target methods are inlined into the callers, we deoptimize the callers to
|
||||
* run in intercept mode to make target methods hookable.
|
||||
* <p>
|
||||
* Only for methods which are included in pre-compiled framework codes.
|
||||
* TODO recompile system apps and priv-apps since their original dex files are available
|
||||
*/
|
||||
public class InlinedMethodCallers {
|
||||
|
||||
public static final String KEY_BOOT_IMAGE = "boot_image";
|
||||
public static final String KEY_SYSTEM_SERVER = "system_server";
|
||||
|
||||
/**
|
||||
* Key should be {@link #KEY_BOOT_IMAGE}, {@link #KEY_SYSTEM_SERVER}, or a package name
|
||||
* of system apps or priv-apps i.e. com.android.systemui
|
||||
*/
|
||||
private static final HashMap<String, String[][]> CALLERS = new HashMap<>();
|
||||
|
||||
/**
|
||||
* format for each row: {className, methodName, methodSig}
|
||||
*/
|
||||
private static final String[][] BOOT_IMAGE = {
|
||||
// callers of Application#attach(Context)
|
||||
{"android.app.Instrumentation", "newApplication", "(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;"}
|
||||
};
|
||||
|
||||
private static final String[][] SYSTEM_SERVER = {};
|
||||
|
||||
private static final String[][] SYSTEM_UI = {};
|
||||
|
||||
static {
|
||||
CALLERS.put(KEY_BOOT_IMAGE, BOOT_IMAGE);
|
||||
CALLERS.put(KEY_SYSTEM_SERVER, SYSTEM_SERVER);
|
||||
CALLERS.put("com.android.systemui", SYSTEM_UI);
|
||||
}
|
||||
|
||||
public static HashMap<String, String[][]> getAll() {
|
||||
return CALLERS;
|
||||
}
|
||||
|
||||
public static String[][] get(String where) {
|
||||
return CALLERS.get(where);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
package com.elderdrivers.riru.edxp.sandhook.util;
|
||||
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.sandhook.util.InlinedMethodCallers.KEY_BOOT_IMAGE;
|
||||
import static com.elderdrivers.riru.edxp.sandhook.util.InlinedMethodCallers.KEY_SYSTEM_SERVER;
|
||||
|
||||
public class PrebuiltMethodsDeopter {
|
||||
|
||||
public static void deoptMethods(String where, ClassLoader cl) {
|
||||
String[][] callers = InlinedMethodCallers.get(where);
|
||||
if (callers == null) {
|
||||
return;
|
||||
}
|
||||
for (String[] caller : callers) {
|
||||
try {
|
||||
Object method = Main.findMethodNative(
|
||||
XposedHelpers.findClass(caller[0], cl), caller[1], caller[2]);
|
||||
if (method != null) {
|
||||
Main.deoptMethodNative(method);
|
||||
}
|
||||
} catch (Throwable throwable) {
|
||||
Utils.logE("error when deopting method: " + Arrays.toString(caller), throwable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void deoptBootMethods() {
|
||||
// todo check if has been done before
|
||||
deoptMethods(KEY_BOOT_IMAGE, null);
|
||||
}
|
||||
|
||||
public static void deoptSystemServerMethods(ClassLoader sysCL) {
|
||||
deoptMethods(KEY_SYSTEM_SERVER, sysCL);
|
||||
}
|
||||
}
|
||||
|
|
@ -55,6 +55,7 @@ afterEvaluate {
|
|||
def myTemplatePath = "${projectDir}/template_override/"
|
||||
|
||||
task("makeAndCopy${variantNameCapped}", type: Jar, dependsOn: "assemble${variantNameCapped}") {
|
||||
dependsOn tasks.getByPath(":edxp-common:copyCommonroperties")
|
||||
from "${buildDir}/intermediates/dex/${variantNameLowered}/mergeDex${variantNameCapped}/out/"
|
||||
destinationDir file(myTemplatePath + "system/framework/")
|
||||
baseName "edxp"
|
||||
|
|
|
|||
|
|
@ -1,14 +1,13 @@
|
|||
package com.elderdrivers.riru.edxp.whale.config;
|
||||
|
||||
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
||||
import com.elderdrivers.riru.edxp.whale.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
||||
import com.lody.whale.WhaleRuntime;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
||||
public class WhaleHookProvider implements HookProvider {
|
||||
public class WhaleHookProvider extends BaseHookProvider {
|
||||
|
||||
@Override
|
||||
public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) {
|
||||
|
|
@ -25,11 +24,6 @@ public class WhaleHookProvider implements HookProvider {
|
|||
return hookMethod;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deoptMethods(String packageName, ClassLoader classLoader) {
|
||||
PrebuiltMethodsDeopter.deoptMethods(packageName, classLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getMethodId(Member member) {
|
||||
return WhaleRuntime.getMethodSlot(member);
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.elderdrivers.riru.edxp.whale.entry.hooker;
|
|||
import android.app.ActivityThread;
|
||||
|
||||
import com.elderdrivers.riru.common.KeepMembers;
|
||||
import com.elderdrivers.riru.edxp.whale.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.whale.entry.Router;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
|
|
|||
|
|
@ -4,10 +4,10 @@ import android.text.TextUtils;
|
|||
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.whale.entry.Router;
|
||||
import com.elderdrivers.riru.edxp.whale.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.util.ProcessUtils;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.elderdrivers.riru.edxp.whale.entry.Router;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package com.elderdrivers.riru.edxp.whale.proxy;
|
|||
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.whale.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.whale.entry.Router;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.FileUtils.getDataPathPrefix;
|
||||
|
|
|
|||
|
|
@ -1,49 +0,0 @@
|
|||
package com.elderdrivers.riru.edxp.whale.util;
|
||||
|
||||
import java.util.HashMap;
|
||||
|
||||
/**
|
||||
* Providing a whitelist of methods which are the callers of the target methods we want to hook.
|
||||
* Because the target methods are inlined into the callers, we deoptimize the callers to
|
||||
* run in intercept mode to make target methods hookable.
|
||||
* <p>
|
||||
* Only for methods which are included in pre-compiled framework codes.
|
||||
* TODO recompile system apps and priv-apps since their original dex files are available
|
||||
*/
|
||||
public class InlinedMethodCallers {
|
||||
|
||||
public static final String KEY_BOOT_IMAGE = "boot_image";
|
||||
public static final String KEY_SYSTEM_SERVER = "system_server";
|
||||
|
||||
/**
|
||||
* Key should be {@link #KEY_BOOT_IMAGE}, {@link #KEY_SYSTEM_SERVER}, or a package name
|
||||
* of system apps or priv-apps i.e. com.android.systemui
|
||||
*/
|
||||
private static final HashMap<String, String[][]> CALLERS = new HashMap<>();
|
||||
|
||||
/**
|
||||
* format for each row: {className, methodName, methodSig}
|
||||
*/
|
||||
private static final String[][] BOOT_IMAGE = {
|
||||
// callers of Application#attach(Context)
|
||||
{"android.app.Instrumentation", "newApplication", "(Ljava/lang/ClassLoader;Ljava/lang/String;Landroid/content/Context;)Landroid/app/Application;"}
|
||||
};
|
||||
|
||||
private static final String[][] SYSTEM_SERVER = {};
|
||||
|
||||
private static final String[][] SYSTEM_UI = {};
|
||||
|
||||
static {
|
||||
CALLERS.put(KEY_BOOT_IMAGE, BOOT_IMAGE);
|
||||
CALLERS.put(KEY_SYSTEM_SERVER, SYSTEM_SERVER);
|
||||
CALLERS.put("com.android.systemui", SYSTEM_UI);
|
||||
}
|
||||
|
||||
public static HashMap<String, String[][]> getAll() {
|
||||
return CALLERS;
|
||||
}
|
||||
|
||||
public static String[][] get(String where) {
|
||||
return CALLERS.get(where);
|
||||
}
|
||||
}
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
package com.elderdrivers.riru.edxp.whale.util;
|
||||
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.whale.util.InlinedMethodCallers.KEY_BOOT_IMAGE;
|
||||
import static com.elderdrivers.riru.edxp.whale.util.InlinedMethodCallers.KEY_SYSTEM_SERVER;
|
||||
|
||||
public class PrebuiltMethodsDeopter {
|
||||
|
||||
public static void deoptMethods(String where, ClassLoader cl) {
|
||||
String[][] callers = InlinedMethodCallers.get(where);
|
||||
if (callers == null) {
|
||||
return;
|
||||
}
|
||||
for (String[] caller : callers) {
|
||||
try {
|
||||
Object method = Main.findMethodNative(
|
||||
XposedHelpers.findClass(caller[0], cl), caller[1], caller[2]);
|
||||
if (method != null) {
|
||||
Main.deoptMethodNative(method);
|
||||
}
|
||||
} catch (Throwable throwable) {
|
||||
Utils.logE("error when deopting method: " + Arrays.toString(caller), throwable);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void deoptBootMethods() {
|
||||
// todo check if has been done before
|
||||
deoptMethods(KEY_BOOT_IMAGE, null);
|
||||
}
|
||||
|
||||
public static void deoptSystemServerMethods(ClassLoader sysCL) {
|
||||
deoptMethods(KEY_SYSTEM_SERVER, sysCL);
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -56,6 +56,7 @@ afterEvaluate {
|
|||
def myTemplatePath = "${projectDir}/template_override/"
|
||||
|
||||
task("makeAndCopy${variantNameCapped}", type: Jar, dependsOn: "assemble${variantNameCapped}") {
|
||||
dependsOn tasks.getByPath(":edxp-common:copyCommonroperties")
|
||||
from "${buildDir}/intermediates/dex/${variantNameLowered}/mergeDex${variantNameCapped}/out/"
|
||||
destinationDir file(myTemplatePath + "system/framework/")
|
||||
baseName "edxp"
|
||||
|
|
|
|||
|
|
@ -1,15 +1,15 @@
|
|||
package com.elderdrivers.riru.edxp.yahfa.config;
|
||||
|
||||
import com.elderdrivers.riru.edxp.hook.HookProvider;
|
||||
import com.elderdrivers.riru.edxp.config.BaseHookProvider;
|
||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DexMakerUtils;
|
||||
import com.elderdrivers.riru.edxp.yahfa.dexmaker.DynamicBridge;
|
||||
import com.elderdrivers.riru.edxp.yahfa.util.PrebuiltMethodsDeopter;
|
||||
|
||||
import java.lang.reflect.Member;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
||||
public class YahfaHookProvider implements HookProvider {
|
||||
public class YahfaHookProvider extends BaseHookProvider {
|
||||
|
||||
@Override
|
||||
public void hookMethod(Member method, XposedBridge.AdditionalHookInfo additionalInfo) {
|
||||
DynamicBridge.hookMethod(method, additionalInfo);
|
||||
|
|
@ -24,14 +24,4 @@ public class YahfaHookProvider implements HookProvider {
|
|||
public Member findMethodNative(Member hookMethod) {
|
||||
return DexMakerUtils.findMethodNative(hookMethod);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deoptMethods(String packageName, ClassLoader classLoader) {
|
||||
PrebuiltMethodsDeopter.deoptMethods(packageName, classLoader);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getMethodId(Member member) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ package com.elderdrivers.riru.edxp.yahfa.entry.hooker;
|
|||
import android.app.ActivityThread;
|
||||
|
||||
import com.elderdrivers.riru.common.KeepMembers;
|
||||
import com.elderdrivers.riru.edxp.yahfa.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.yahfa.entry.Router;
|
||||
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
|
|
|
|||
|
|
@ -4,8 +4,8 @@ import android.text.TextUtils;
|
|||
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.yahfa.entry.Router;
|
||||
import com.elderdrivers.riru.edxp.yahfa.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.util.ProcessUtils;
|
||||
import com.elderdrivers.riru.edxp.util.Utils;
|
||||
|
||||
|
|
|
|||
|
|
@ -2,7 +2,7 @@ package com.elderdrivers.riru.edxp.yahfa.proxy;
|
|||
|
||||
import com.elderdrivers.riru.edxp.Main;
|
||||
import com.elderdrivers.riru.edxp.config.ConfigManager;
|
||||
import com.elderdrivers.riru.edxp.yahfa.util.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.deopt.PrebuiltMethodsDeopter;
|
||||
import com.elderdrivers.riru.edxp.yahfa.entry.Router;
|
||||
|
||||
import static com.elderdrivers.riru.edxp.util.FileUtils.getDataPathPrefix;
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -73,5 +73,15 @@ public class EdXpConfigGlobal {
|
|||
public long getMethodId(Member member) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object findMethodNative(Class clazz, String methodName, String methodSig) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deoptMethodNative(Object method) {
|
||||
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,4 +15,8 @@ public interface HookProvider {
|
|||
void deoptMethods(String packageName, ClassLoader classLoader);
|
||||
|
||||
long getMethodId(Member member);
|
||||
|
||||
Object findMethodNative(Class clazz, String methodName, String methodSig);
|
||||
|
||||
void deoptMethodNative(Object method);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue