chore: optimize hook param clean up
This commit is contained in:
@@ -161,12 +161,15 @@ public class XposedBridge {
|
||||
wrappedParam.method = param.getMember();
|
||||
wrappedParam.thisObject = param.getThisObject();
|
||||
wrappedParam.args = param.getArgs();
|
||||
callback.afterHookedMethod(wrappedParam);
|
||||
// clear fields to avoid memory leaks
|
||||
wrappedParam.method = null;
|
||||
wrappedParam.thisObject = null;
|
||||
wrappedParam.args = null;
|
||||
param.setExtra(null);
|
||||
try {
|
||||
callback.afterHookedMethod(wrappedParam);
|
||||
} finally {
|
||||
// clear fields to avoid memory leaks
|
||||
wrappedParam.method = null;
|
||||
wrappedParam.thisObject = null;
|
||||
wrappedParam.args = null;
|
||||
param.setExtra(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -206,6 +206,7 @@ public class Lsp100HookWrapper {
|
||||
@NonNull
|
||||
@Override
|
||||
public Member getMember() {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
return after.getMember();
|
||||
} else {
|
||||
@@ -216,6 +217,7 @@ public class Lsp100HookWrapper {
|
||||
@Nullable
|
||||
@Override
|
||||
public Object getThisObject() {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
return after.getThisObject();
|
||||
} else {
|
||||
@@ -226,6 +228,7 @@ public class Lsp100HookWrapper {
|
||||
@NonNull
|
||||
@Override
|
||||
public Object[] getArgs() {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
return after.getArgs();
|
||||
} else {
|
||||
@@ -236,6 +239,7 @@ public class Lsp100HookWrapper {
|
||||
@Nullable
|
||||
@Override
|
||||
public Object getResult() {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
return after.getResult();
|
||||
} else {
|
||||
@@ -245,6 +249,7 @@ public class Lsp100HookWrapper {
|
||||
|
||||
@Override
|
||||
public void setResult(@Nullable Object result) {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
after.setResult(result);
|
||||
} else {
|
||||
@@ -255,6 +260,7 @@ public class Lsp100HookWrapper {
|
||||
@Nullable
|
||||
@Override
|
||||
public Throwable getThrowable() {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
return after.getThrowable();
|
||||
} else {
|
||||
@@ -264,6 +270,7 @@ public class Lsp100HookWrapper {
|
||||
|
||||
@Override
|
||||
public void setThrowable(@NonNull Throwable throwable) {
|
||||
checkLifecycle();
|
||||
if (isAfter) {
|
||||
after.setThrowable(throwable);
|
||||
} else {
|
||||
@@ -274,6 +281,7 @@ public class Lsp100HookWrapper {
|
||||
@Nullable
|
||||
@Override
|
||||
public Object getExtra() {
|
||||
checkLifecycle();
|
||||
if (extras == null) {
|
||||
return null;
|
||||
}
|
||||
@@ -282,12 +290,20 @@ public class Lsp100HookWrapper {
|
||||
|
||||
@Override
|
||||
public void setExtra(@Nullable Object extra) {
|
||||
checkLifecycle();
|
||||
if (extras == null) {
|
||||
// create on demand
|
||||
extras = new Object[callbacks.length];
|
||||
}
|
||||
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<>();
|
||||
|
||||
@@ -42,53 +42,68 @@ public class Xp51HookWrapper {
|
||||
@NonNull
|
||||
@Override
|
||||
public Member getMember() {
|
||||
checkLifecycle();
|
||||
return mParam.method;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Object getThisObject() {
|
||||
checkLifecycle();
|
||||
return mParam.thisObject;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Object[] getArgs() {
|
||||
checkLifecycle();
|
||||
return mParam.args;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Object getResult() {
|
||||
checkLifecycle();
|
||||
return mParam.getResult();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setResult(@Nullable Object result) {
|
||||
checkLifecycle();
|
||||
mParam.setResult(result);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Throwable getThrowable() {
|
||||
checkLifecycle();
|
||||
return mParam.getThrowable();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setThrowable(@NonNull Throwable throwable) {
|
||||
checkLifecycle();
|
||||
mParam.setThrowable(throwable);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Object getExtra() {
|
||||
checkLifecycle();
|
||||
return mExtra;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setExtra(@Nullable Object extra) {
|
||||
checkLifecycle();
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user