Cronet简介
Cronet 是 Google 开发的一个网络库,旨在提供高性能、低延迟的网络请求和数据传输。它是基于 Chromium 项目的网络堆栈构建的,专注于提供快速、可靠和安全的网络连接。Cronet 主要用于 Android 平台,尤其适用于需要实现高性能网络操作的应用程序,如浏览器、移动应用和其他网络依赖应用。
以下是 Cronet 的一些特点和优势:
- QUIC 协议支持:Cronet 引入了 QUIC(Quick UDP Internet Connections)协议,这是一个基于 UDP 的传输协议,旨在提供更快的网络连接和数据传输。QUIC 可以加速连接建立和数据传输,尤其在高丢包和高延迟的网络环境中表现出色。
- 多路复用和连接池:Cronet 支持多路复用,允许在单个连接上同时发送多个请求,从而减少连接建立和数据传输的开销。它还提供了连接池来重用连接,减少资源消耗和延迟。
- 性能优化:Cronet 针对性能进行了优化,包括对 DNS 解析的优化、启发式连接重试等。它还支持数据压缩和预加载功能,以提高数据传输效率。
- 适应性和可配置性:Cronet 允许开发者根据应用需求进行配置,包括对请求超时、连接超时、缓存策略等的配置。它还支持对特定域名或请求进行定制处理。
- 安全性:Cronet 集成了 Chromium 的安全性功能,包括 SSL/TLS 支持和证书验证,确保网络连接的安全性。
- 跨平台支持:尽管 Cronet 主要用于 Android 平台,但它也具有适用于其他平台的支持,如 iOS、Linux 等。
- 异步操作:Cronet 提供异步的 API,允许在后台线程执行网络操作,从而避免阻塞 UI 线程。
总之,Cronet 是一个用于实现高性能网络操作的强大工具,特别适用于那些需要在高延迟、高丢包等不稳定网络环境下实现快速和可靠网络传输的应用程序。它允许开发者利用 QUIC 协议和其他优化策略来提高网络性能
动手体验
1.引入相关库
// cronet网络库引擎
implementation("org.chromium.net:cronet-embedded:113.5672.61")
// okhttp
implementation("com.squareup.okhttp3:okhttp:4.11.0")
// cronet对okhttp的支持库
implementation("com.google.net.cronet:cronet-okhttp:0.1.0")
2.使用cronet替换okhttp核心
private lateinit var cronetEngine: CronetEngine
private lateinit var okhttpClient: OkHttpClient
private fun initCronetAndOkHttp() {
val myBuilder = CronetEngine.Builder(this)
cronetEngine = myBuilder
.enableHttp2(true)
.enableQuic(true)
.setUserAgent("OkHttp with Cronet!")
.build()
okhttpClient = OkHttpClient.Builder()
.addInterceptor(CronetInterceptor.newBuilder(cronetEngine).build())
.build();
}
3.使用okhttp替换webview默认请求
binding.webview.webViewClient = object : WebViewClient() {
override fun shouldInterceptRequest(
view: WebView?,
request: WebResourceRequest?
): WebResourceResponse? {
Log.v("liujie,webRequest:", request.toString())
try {
val okRequest: Request = Request.Builder()
.url(request?.url.toString())
.build()
var response: Response? = null
try {
response = okhttpClient.newCall(okRequest).execute()
Log.e("liujie,response:headers", response.headers.toString())
val contentTypeList =
response.header("Content-Type", "text/html")?.split(";")
var mimeType = "text/html"
var encoding: String? = "utf-8"
if (!contentTypeList.isNullOrEmpty()) {
mimeType = contentTypeList[0]
if (contentTypeList.size > 1) {
encoding = response.header("content-encoding", contentTypeList[1])
}
}
return WebResourceResponse(
mimeType,
encoding,
response.body?.byteStream()
)
} catch (err: Exception) {
Log.e("liujie,err", err.message.toString())
} finally {
}
return super.shouldInterceptRequest(view, request)
} catch (e: Exception) {
return super.shouldInterceptRequest(view, request)
}
}
}
4.测试
测试网站:https://www.gksec.com/HTTP3.html
效果:
先看下对应的ip方便后面抓包使用
使用wireshark抓包,如下
5.缺点
1.国内没法用gms服务,需要引入完整的Cronet库64为so库2.5MB,32位2.2MB大小
2.替换okhttp内核存在兼容问题,例如okhttp缓存、拦截器、cookie等设置存在问题,具体问题参考 google/cronet-transport-for-okhttp: This package allows OkHttp and Retrofit users to use Cronet as their transport layer, benefiting from features like QUIC/HTTP3 support or connection migration. (github.com)
3.由于不能无痛替换okhttp且国内还需要引入完整的Cronet库,目前还不太推荐使用