chore: optimize hook param clean up
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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<>();
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user