海神平台是我们自主研发的一个移动端质量监控平台,从去年7月份开始至今,已陆续上线了Crash监控、ANR监控、网络监控、自定义错误等功能,目前已接入了公司内10余款APP。针对Crash我们之前在《海神平台Crash监控SDK(Android)开发经验总结》一文中有专门介绍,本文会着重讲一下Android端在开发网络监控SDK过程中的一些实践和经验。希望大家能有所收获。
一 完整网络请求的流程
一次网络请求通常会经过以下步骤:
- DNS过程:将目标域名转成IP;
- Connect过程:主要包括TCP的三次握手、HTTPS的SSL握手;
- 业务数据传输过程:request与response数据传输
下图以OKHttp在github上提供的流程图(https://square.github.io/okhttp/events/)为蓝本,将一些监控指标标示出来。
借用听云官方文档中的介绍,一次网络请求的响应时间可以分解为如下几部分:
- DNS时间:将域名转换为数字IP的时间。
- TCP时间:建立TCP/IP连接的时间。
- SSL时间:建立安全套接层(SSL)连接的消耗时间。
- 客户端耗时:客户端等待处理请求响应的耗时。
- 首包时间:发送HTTP请求开始,到收到服务器返回的第一个数据包所消耗时间。此指标反映服务器的响应速度。
- 剩余包时间:客户端接受服务器返回的非第一个数据包的消耗时间。
目前的海神版本只提供了DNS时间、TCP时间、SSL时间以及首包时间等四大分解时间。DNS时间主要取决于DNS服务商,TCP时间和SSL时间能够反映当时的网络链路状况,首包时间主要受网络链路状况和服务端响应速度影响。此外数据包大小也会影响到响应时间。
二 基于OKHttp SDK进行Hook的实践
2.1 EventListener
OKHttp从3.11.0版本开始,就提供了类EventListener,详见:https://square.github.io/okhttp/events/。
EventListener的调用方式如下:
OkHttpClient client = new OkHttpClient.Builder()
.eventListener(new CustomerXXXEventListener())
.build();
其中CustomerXXXEventListener继承