Skip to content

Commit 9afb9eb

Browse files
committed
chore: add hooked method list
1 parent 97fcff0 commit 9afb9eb

File tree

6 files changed

+54
-0
lines changed

6 files changed

+54
-0
lines changed

app/src/main/java/io/github/qauxv/util/hookimpl/lsplant/LsplantHookImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@
3535
import java.lang.reflect.Member;
3636
import java.lang.reflect.Method;
3737
import java.lang.reflect.Modifier;
38+
import java.util.Collections;
3839
import java.util.HashSet;
3940
import java.util.Objects;
41+
import java.util.Set;
4042
import java.util.concurrent.ConcurrentHashMap;
4143
import java.util.concurrent.atomic.AtomicLong;
4244

@@ -134,10 +136,17 @@ public <T> T newInstanceOrigin(@NonNull Constructor<T> constructor, @NonNull Obj
134136
public long getHookCounter() {
135137
return sHookCounter.get() - 1;
136138
}
139+
140+
@Override
141+
public Set<Member> getHookedMethods() {
142+
// return a read-only set
143+
return Collections.unmodifiableSet(sHookedMethods);
144+
}
137145
}
138146

139147
private static Member sCallbackMethod;
140148
private static AtomicLong sHookCounter = new AtomicLong(0);
149+
private static final Set<Member> sHookedMethods = ConcurrentHashMap.newKeySet();
141150

142151
private static synchronized void initializeLsplantInternal() {
143152
if (isInitialized) {
@@ -318,6 +327,8 @@ private static IHookBridge.MemberUnhookHandle hookMethodImpl(@NonNull Member mem
318327
token.setBackupMember(backup);
319328
// add token to holder
320329
holder.token = token;
330+
// add to hooked methods set
331+
sHookedMethods.add(member);
321332
}
322333
// step 2. add callback to list, descending order by priority
323334
int newSize = holder.callbacks.length + 1;

loader/hookapi/src/main/java/io/github/qauxv/loader/hookapi/IHookBridge.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.lang.reflect.InvocationTargetException;
99
import java.lang.reflect.Member;
1010
import java.lang.reflect.Method;
11+
import java.util.Set;
1112

1213
@Keep
1314
public interface IHookBridge {
@@ -251,4 +252,13 @@ <T> T newInstanceOrigin(@NonNull Constructor<T> constructor, @NonNull Object...
251252
*/
252253
long getHookCounter();
253254

255+
/**
256+
* Get the hooked methods. Caller should not modify the returned set.
257+
* <p>
258+
* Hooked methods are methods that have been hooked by this module. This method is useful for debugging and logging purposes.
259+
*
260+
* @return The hooked methods
261+
*/
262+
Set<Member> getHookedMethods();
263+
254264
}

loader/sbl/src/main/java/io/github/qauxv/loader/sbl/lsp100/Lsp100HookImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import java.lang.reflect.InvocationTargetException;
3636
import java.lang.reflect.Member;
3737
import java.lang.reflect.Method;
38+
import java.util.Collections;
39+
import java.util.Set;
3840

3941
public class Lsp100HookImpl implements IHookBridge, ILoaderService {
4042

@@ -177,4 +179,10 @@ public long getHookCounter() {
177179
return Lsp100HookWrapper.getHookCounter();
178180
}
179181

182+
@Override
183+
public Set<Member> getHookedMethods() {
184+
// return a read-only set
185+
return Collections.unmodifiableSet(Lsp100HookWrapper.getHookedMethodsRaw());
186+
}
187+
180188
}

loader/sbl/src/main/java/io/github/qauxv/loader/sbl/lsp100/Lsp100HookWrapper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import java.lang.reflect.Member;
3535
import java.lang.reflect.Method;
3636
import java.util.ArrayList;
37+
import java.util.Set;
3738
import java.util.concurrent.ConcurrentHashMap;
3839
import java.util.concurrent.atomic.AtomicLong;
3940

@@ -47,6 +48,7 @@ private Lsp100HookWrapper() {
4748
private static final CallbackWrapper[] EMPTY_CALLBACKS = new CallbackWrapper[0];
4849

4950
private static final AtomicLong sNextHookId = new AtomicLong(1);
51+
private static final Set<Member> sHookedMethods = ConcurrentHashMap.newKeySet();
5052

5153
private static final Object sRegistryWriteLock = new Object();
5254

@@ -130,6 +132,8 @@ public static UnhookHandle hookAndRegisterMethodCallback(
130132
CallbackListHolder newHolder = new CallbackListHolder();
131133
callbackList.put(method, newHolder);
132134
holder = newHolder;
135+
// add to hooked methods set
136+
sHookedMethods.add(method);
133137
}
134138
}
135139
// 4. add the callback to the holder
@@ -461,4 +465,8 @@ public static int getHookCounter() {
461465
return (int) (sNextHookId.get() - 1);
462466
}
463467

468+
public static Set<Member> getHookedMethodsRaw() {
469+
return sHookedMethods;
470+
}
471+
464472
}

loader/sbl/src/main/java/io/github/qauxv/loader/sbl/xp51/Xp51HookImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import java.lang.reflect.InvocationTargetException;
3636
import java.lang.reflect.Member;
3737
import java.lang.reflect.Method;
38+
import java.util.Collections;
39+
import java.util.Set;
3840

3941
public class Xp51HookImpl implements IHookBridge, ILoaderService {
4042

@@ -78,6 +80,8 @@ public MemberUnhookHandle hookMethod(@NonNull Member member, @NonNull IMemberHoo
7880
if (unhook == null) {
7981
throw new UnsupportedOperationException("XposedBridge.hookMethod return null for member: " + member);
8082
}
83+
// add to hooked methods set
84+
Xp51HookWrapper.getHookedMethodsRaw().add(member);
8185
return new Xp51HookWrapper.Xp51UnhookHandle(unhook, member, cb);
8286
}
8387

@@ -174,4 +178,9 @@ public long getHookCounter() {
174178
return Xp51HookWrapper.getHookCounter();
175179
}
176180

181+
@Override
182+
public Set<Member> getHookedMethods() {
183+
// return a read-only set
184+
return Collections.unmodifiableSet(Xp51HookWrapper.getHookedMethodsRaw());
185+
}
177186
}

loader/sbl/src/main/java/io/github/qauxv/loader/sbl/xp51/Xp51HookWrapper.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@
2727
import de.robv.android.xposed.XC_MethodHook;
2828
import io.github.qauxv.loader.hookapi.IHookBridge;
2929
import java.lang.reflect.Member;
30+
import java.util.Set;
31+
import java.util.concurrent.ConcurrentHashMap;
3032
import java.util.concurrent.atomic.AtomicLong;
3133

3234
public class Xp51HookWrapper {
3335

3436
private static final AtomicLong sNextHookId = new AtomicLong(1);
37+
private static final Set<Member> sHookedMethods = ConcurrentHashMap.newKeySet();
3538
private static final String TAG_PREFIX = "qauxv_hcb_";
3639

3740
public static class Xp51HookParam implements IHookBridge.IMemberHookParam {
@@ -188,4 +191,9 @@ public static int getHookCounter() {
188191
return (int) (sNextHookId.get() - 1);
189192
}
190193

194+
@NonNull
195+
public static Set<Member> getHookedMethodsRaw() {
196+
return sHookedMethods;
197+
}
198+
191199
}

0 commit comments

Comments
 (0)