玩一玩chrome网络请求库Cronet
  N22K9a9joVWJ 2023年11月02日 59 0

Cronet简介

Cronet 是 Google 开发的一个网络库,旨在提供高性能、低延迟的网络请求和数据传输。它是基于 Chromium 项目的网络堆栈构建的,专注于提供快速、可靠和安全的网络连接。Cronet 主要用于 Android 平台,尤其适用于需要实现高性能网络操作的应用程序,如浏览器、移动应用和其他网络依赖应用。

以下是 Cronet 的一些特点和优势:

  1. QUIC 协议支持:Cronet 引入了 QUIC(Quick UDP Internet Connections)协议,这是一个基于 UDP 的传输协议,旨在提供更快的网络连接和数据传输。QUIC 可以加速连接建立和数据传输,尤其在高丢包和高延迟的网络环境中表现出色。
  2. 多路复用和连接池:Cronet 支持多路复用,允许在单个连接上同时发送多个请求,从而减少连接建立和数据传输的开销。它还提供了连接池来重用连接,减少资源消耗和延迟。
  3. 性能优化:Cronet 针对性能进行了优化,包括对 DNS 解析的优化、启发式连接重试等。它还支持数据压缩和预加载功能,以提高数据传输效率。
  4. 适应性和可配置性:Cronet 允许开发者根据应用需求进行配置,包括对请求超时、连接超时、缓存策略等的配置。它还支持对特定域名或请求进行定制处理。
  5. 安全性:Cronet 集成了 Chromium 的安全性功能,包括 SSL/TLS 支持和证书验证,确保网络连接的安全性。
  6. 跨平台支持:尽管 Cronet 主要用于 Android 平台,但它也具有适用于其他平台的支持,如 iOS、Linux 等。
  7. 异步操作: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

效果:

玩一玩chrome网络请求库Cronet_网络连接

先看下对应的ip方便后面抓包使用

玩一玩chrome网络请求库Cronet_数据传输_02

使用wireshark抓包,如下

玩一玩chrome网络请求库Cronet_数据传输_03

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库,目前还不太推荐使用

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  0VPjM5rNGpd8   2023年12月23日   45   0   0 htmlhtmlCSSCSS
N22K9a9joVWJ
作者其他文章 更多