我一直在使用类似于提出的答案here的解决方案来设置WebView代理。但是,铬似乎开始混淆类别名称,因此使用较新的铬版本不再可能通过使用类别名称进行反射来标识广播接收器。
我考虑过的解决方案是在当前应用程序上下文中的所有广播接收器上调用onReceive。
这不是理想的解决方案,因为调用错误的接收器可能会带来不良的副作用。
有更好的方法吗?谢谢
基于先前的答案,我的解决方案如下所示:
Class applictionCls = Class.forName(applicationClassName);
Field loadedApkField = applictionCls.getField("mLoadedApk");
loadedApkField.setAccessible(true);
Object loadedApk = loadedApkField.get(appContext);
Class loadedApkCls = Class.forName("android.app.LoadedApk");
Field receiversField = loadedApkCls.getDeclaredField("mReceivers");
receiversField.setAccessible(true);
ArrayMap receivers = (ArrayMap) receiversField.get(loadedApk);
ArrayMap contextReceivers = (ArrayMap) receivers.get(appContext);
for (Object rec : contextReceivers.keySet()) {
Class clazz = rec.getClass();
Method onReceiveMethod = clazz.getDeclaredMethod("onReceive", Context.class, Intent.class);
Intent intent = new Intent(Proxy.PROXY_CHANGE_ACTION);
try {
onReceiveMethod.invoke(rec, appContext, intent);
} catch (Exception e) {
// oops, couldn't invoke this receiver
}
}