chore: optimize hook param clean up

This commit is contained in:
ACh Sulfate
2024-07-24 10:26:52 +08:00
parent f1c63bebfd
commit 523000ac99
3 changed files with 40 additions and 6 deletions

View File

@@ -161,7 +161,9 @@ public class XposedBridge {
wrappedParam.method = param.getMember(); wrappedParam.method = param.getMember();
wrappedParam.thisObject = param.getThisObject(); wrappedParam.thisObject = param.getThisObject();
wrappedParam.args = param.getArgs(); wrappedParam.args = param.getArgs();
try {
callback.afterHookedMethod(wrappedParam); callback.afterHookedMethod(wrappedParam);
} finally {
// clear fields to avoid memory leaks // clear fields to avoid memory leaks
wrappedParam.method = null; wrappedParam.method = null;
wrappedParam.thisObject = null; wrappedParam.thisObject = null;
@@ -169,6 +171,7 @@ public class XposedBridge {
param.setExtra(null); param.setExtra(null);
} }
} }
}
/** /**
* Basically the same as {@link Method#invoke}, but calls the original method as it was before the interception by Xposed. Also, access permissions are not * Basically the same as {@link Method#invoke}, but calls the original method as it was before the interception by Xposed. Also, access permissions are not

View File

@@ -206,6 +206,7 @@ public class Lsp100HookWrapper {
@NonNull @NonNull
@Override @Override
public Member getMember() { public Member getMember() {
checkLifecycle();
if (isAfter) { if (isAfter) {
return after.getMember(); return after.getMember();
} else { } else {
@@ -216,6 +217,7 @@ public class Lsp100HookWrapper {
@Nullable @Nullable
@Override @Override
public Object getThisObject() { public Object getThisObject() {
checkLifecycle();
if (isAfter) { if (isAfter) {
return after.getThisObject(); return after.getThisObject();
} else { } else {
@@ -226,6 +228,7 @@ public class Lsp100HookWrapper {
@NonNull @NonNull
@Override @Override
public Object[] getArgs() { public Object[] getArgs() {
checkLifecycle();
if (isAfter) { if (isAfter) {
return after.getArgs(); return after.getArgs();
} else { } else {
@@ -236,6 +239,7 @@ public class Lsp100HookWrapper {
@Nullable @Nullable
@Override @Override
public Object getResult() { public Object getResult() {
checkLifecycle();
if (isAfter) { if (isAfter) {
return after.getResult(); return after.getResult();
} else { } else {
@@ -245,6 +249,7 @@ public class Lsp100HookWrapper {
@Override @Override
public void setResult(@Nullable Object result) { public void setResult(@Nullable Object result) {
checkLifecycle();
if (isAfter) { if (isAfter) {
after.setResult(result); after.setResult(result);
} else { } else {
@@ -255,6 +260,7 @@ public class Lsp100HookWrapper {
@Nullable @Nullable
@Override @Override
public Throwable getThrowable() { public Throwable getThrowable() {
checkLifecycle();
if (isAfter) { if (isAfter) {
return after.getThrowable(); return after.getThrowable();
} else { } else {
@@ -264,6 +270,7 @@ public class Lsp100HookWrapper {
@Override @Override
public void setThrowable(@NonNull Throwable throwable) { public void setThrowable(@NonNull Throwable throwable) {
checkLifecycle();
if (isAfter) { if (isAfter) {
after.setThrowable(throwable); after.setThrowable(throwable);
} else { } else {
@@ -274,6 +281,7 @@ public class Lsp100HookWrapper {
@Nullable @Nullable
@Override @Override
public Object getExtra() { public Object getExtra() {
checkLifecycle();
if (extras == null) { if (extras == null) {
return null; return null;
} }
@@ -282,12 +290,20 @@ public class Lsp100HookWrapper {
@Override @Override
public void setExtra(@Nullable Object extra) { public void setExtra(@Nullable Object extra) {
checkLifecycle();
if (extras == null) { if (extras == null) {
// create on demand // create on demand
extras = new Object[callbacks.length]; extras = new Object[callbacks.length];
} }
extras[index] = extra; extras[index] = extra;
} }
private void checkLifecycle() {
if ((isAfter && after == null) || (!isAfter && before == null)) {
throw new IllegalStateException("attempt to access hook param after destroyed");
}
}
} }
private static final ConcurrentHashMap<Class<?>, ConcurrentHashMap<Member, CallbackListHolder>> sCallbackRegistry = new ConcurrentHashMap<>(); private static final ConcurrentHashMap<Class<?>, ConcurrentHashMap<Member, CallbackListHolder>> sCallbackRegistry = new ConcurrentHashMap<>();

View File

@@ -42,53 +42,68 @@ public class Xp51HookWrapper {
@NonNull @NonNull
@Override @Override
public Member getMember() { public Member getMember() {
checkLifecycle();
return mParam.method; return mParam.method;
} }
@Nullable @Nullable
@Override @Override
public Object getThisObject() { public Object getThisObject() {
checkLifecycle();
return mParam.thisObject; return mParam.thisObject;
} }
@NonNull @NonNull
@Override @Override
public Object[] getArgs() { public Object[] getArgs() {
checkLifecycle();
return mParam.args; return mParam.args;
} }
@Nullable @Nullable
@Override @Override
public Object getResult() { public Object getResult() {
checkLifecycle();
return mParam.getResult(); return mParam.getResult();
} }
@Override @Override
public void setResult(@Nullable Object result) { public void setResult(@Nullable Object result) {
checkLifecycle();
mParam.setResult(result); mParam.setResult(result);
} }
@Nullable @Nullable
@Override @Override
public Throwable getThrowable() { public Throwable getThrowable() {
checkLifecycle();
return mParam.getThrowable(); return mParam.getThrowable();
} }
@Override @Override
public void setThrowable(@NonNull Throwable throwable) { public void setThrowable(@NonNull Throwable throwable) {
checkLifecycle();
mParam.setThrowable(throwable); mParam.setThrowable(throwable);
} }
@Nullable @Nullable
@Override @Override
public Object getExtra() { public Object getExtra() {
checkLifecycle();
return mExtra; return mExtra;
} }
@Override @Override
public void setExtra(@Nullable Object extra) { public void setExtra(@Nullable Object extra) {
checkLifecycle();
mExtra = extra; mExtra = extra;
} }
private void checkLifecycle() {
if (mParam == null) {
throw new IllegalStateException("attempt to access hook param after destroyed");
}
}
} }
public static class Xp51HookCallback extends XC_MethodHook { public static class Xp51HookCallback extends XC_MethodHook {