Android: 如何以编程方式捕获应用程序的网络流量?

Android: How to capture App's Network Traffic Programmatically?

我目前正在开发一个库,使 QA 或开发人员能够在他们的应用程序中调试网络流量,我们目前使用 OKHttp,并且我知道如何创建拦截器并将所有请求数据分派到库。这样开发人员或 QA 就可以查看此类数据(Payload/URL/Size/Response Codes/Duration...等),但是我想创建一个更通用的解决方案来侦听 HTTP 流量甚至 TCP 流量,然后从那里获取它,但是我找不到起点,我知道这是可能的,因为 Firebase Performance 正在这样做,但我仍然找不到 API 或无论如何都无法收听此类流量。

我希望 Google 的 Firebase 性能团队的人分享一些关于他们如何做到这一点的信息,如果这不是商业秘密的话:)

我遇到了这个解决方案:https://github.com/cyruliu/Sensitive_API_Monitor/blob/master/app/src/main/java/com/android/reverse/apimonitor/NetWorkHook.java 但是用反射看起来有点糟糕,我希望找到更好的方法。

简短的回答:不代理整个设备是不可能的。

特别是对于 OkHttp3,我在这里写了一个库:https://github.com/shehabic/sherlock 它实现了一个拦截器,每次打开应用程序时都会创建一个新会话并捕获网络请求,你也可以有多个会话,它添加了一个浮动帮助您访问会话和请求的历史记录以及一些导出功能的图标,此外,它还添加了一个辅助启动器图标,您可以使用该图标访问捕获请求而不会中断应用程序的进程。

关于 Firebase 性能,所有的魔法实际上都在 Firebase-Perf Gradle 插件中;为了简化它,它扫描了项目的代码并替换了对 OkHttpClient 的直接调用,以通过他们自己的 FirebaseOkHttpClient 进行代理,并且当他们成为 http 客户端时,他们甚至从那里获得 https 请求的所有详细信息。

我希望这能在将来节省一些时间。