OkHttp的性能指标拦截(建链,握手,首包,剩余包时间)

Posted 壮士暮年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OkHttp的性能指标拦截(建链,握手,首包,剩余包时间)相关的知识,希望对你有一定的参考价值。

最近,部门接到新的任务就是做httpClient,URLConnection,OKhttpClient,webview的网络性能指标进行监控,当然这些指标最准确的方法还是使用jni在底层建链与dns解析,发包等函数进行hook,再进行指标采集。但领导要求我们在java层尝试一下,今天主要记录下,我对OkHttp网络指标采集的调研结果和尝试。

1   OkHttpClient client = new OkHttpClient();
2   Request request = new Request.Builder().url(url).get().build();
3   Response response = client.newCall(request).execute();

 对于httpClient我们通尝都是替换execute()方法,然后对httpClient的对像进行更改配置自己的拦截功能,查看源码,发现OkHttpClient相对不同的是execute方法并不在OkHttpClient,而是newCall方法中new 了一个call实例。

1 public Call newCall(Request request) {
2     return new Call(this, request);
3   }

//Call构造器中,对OkHttpClient进行了深拷备,所以对newCall之后的OkHttpClient配置都将无法生效,所以我们必须在newCall之前将拦截代码进行塞入
 Call(OkHttpClient client, Request originalRequest) {
  // Copy the client. Otherwise changes (socket factory, redirect policy,
  // etc.) may incorrectly be reflected in the request when it is
  // executed.
  this.client = client.copyWithDefaults();
  this.originalRequest = originalRequest;
 }

发现Call类并不是final的,所以决定对其继承,因为 Call的构造器是protected的,所以子类需要在相同的包名下,而上层的拦截于是这样实现的

1   public static Call newCall(OkHttpClient okHttpClient, Request paramRequest)
2     {
3       return new MyCall(okHttpClient, paramRequest, okHttpClient.newCall(paramRequest));
4     }

MyCall类的中的public,protected方法进行重写(execute(),enqueue(Callback paramCallback),cancel(),isCanceled()),实现使用传入的call进行调用,重写

以上是关于OkHttp的性能指标拦截(建链,握手,首包,剩余包时间)的主要内容,如果未能解决你的问题,请参考以下文章

OkHttp3 拦截器源码分析

okhttp连接池复用机制

okhttp连接池复用机制

42. OkHttp总结

Okhttp3拦截器-应用拦截器和网络拦截器的区别

OKHttp五大拦截器