From 5be0bcde8aeb72b1e8c692601980497555e90b33 Mon Sep 17 00:00:00 2001 From: Tim Perry Date: Fri, 31 Jul 2026 14:10:58 +0200 Subject: [PATCH] Speed up ProxySelector override hook --- android/android-proxy-override.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/android/android-proxy-override.js b/android/android-proxy-override.js index d4248e6..d333fda 100644 --- a/android/android-proxy-override.js +++ b/android/android-proxy-override.js @@ -78,12 +78,20 @@ Java.perform(() => { const ProxySelector = Java.use('java.net.ProxySelector'); // Find every implementation of ProxySelector by quickly scanning method signatures, and - // then checking whether each match actually implements java.net.ProxySelector: - const proxySelectorClasses = Java.enumerateMethods('*!select(java.net.URI): java.util.List/s') - .flatMap((matchingLoader) => matchingLoader.classes - .map((classData) => Java.use(classData.name)) - .filter((Cls) => ProxySelector.class.isAssignableFrom(Cls.class)) - ); + // then checking whether each match actually implements java.net.ProxySelector. + // + // Scanning every class is slow, so we can the apps own classes in full, but scan platform + // classes only for *Proxy* (matches all known cases). + const selectorClassNames = new Set([ + '*Proxy*!select(java.net.URI): java.util.List/s', + '*!select(java.net.URI): java.util.List/su' + ].flatMap((query) => Java.enumerateMethods(query)) + .flatMap((matchingLoader) => matchingLoader.classes.map((classData) => classData.name)) + ); + + const proxySelectorClasses = [...selectorClassNames] + .map((className) => Java.use(className)) + .filter((Cls) => ProxySelector.class.isAssignableFrom(Cls.class)); // Replace the 'select' of every implementation, so they all send traffic to us: proxySelectorClasses.forEach(ProxySelectorCls => {