okcronet 来了,QUIC时代okhttp的替代品

okcronet 是类似 okhttp 的网络请求库,使用 Cronet 实现。

Github

与 Retrofit 对应的库是msnet(后续写文章介绍)

为何写这个库

HTTP3/QUIC在大厂里已经玩烂了,可是大部分app依然无法使用起来,归结原因就是:没有时间精力去做cronet的开发,cronet使用起来是非常原始的,非常不易使用的,如不封装,基本不可能用来替代现有业务上的框架。

虽然 Google 提供了一个 okhttpCronet 的桥接实现 cronet-transport-for-okhttp,但是正如 READMEIncompatibilities(不兼容性)内容中所描述的,你无法使用该源码来完善其功能。

ps: 我之前写过两个版本桥接器,真的有些问题无法解决

关于 okhttp 在对 HTTP3/QUIC 的支持性方面的解答,可以查看此issues。总结起来就是:okhttp不会再去实现 HTTP3/QUIC 协议,建议使用拦截器的方式来桥接到 cronet 上。结果又回到了上面的不兼容性问题。

因此,okcronet 项目的目标是,解决这些问题。okcronet 和 okhttp一样,是一个基础库,有了这个,才会有其他的更多故事。

okcronet 的优势

  • 使用简单,与 OkHttp 使用方式保持一致
  • 支持 HTTP3/QUIC,可以提供更好的网络性能
  • 支持 Cronet 的所有功能,例如缓存、线程池、代理等

引用

你需要同时引用本库以及 Cronet 库。 关于 Cronet 的引用,你可以使用任何 Cronet 的实现库,只要它遵守 cronet-api

引入本库

scss 复制代码
    // 引入本库
    implementation("io.github.limuyang2:okcronet:1.0.0")

引入 Cronet 库

scss 复制代码
    // 示例,这是直接引入 Google 官方提供的 Cronet,并且包含本地 so 库的 lib(大陆地区推荐这种方式)
    implementation("org.chromium.net:cronet-api:119.6045.31")
    implementation("org.chromium.net:cronet-common:119.6045.31")
    implementation("org.chromium.net:cronet-embedded:119.6045.31")


    // 如果你是直接使用 Google Play 的海外app,不需要考虑中国大陆的情况,可以直接使用 Google Play 提供的 so,不需要在APK中打包 so 文件
    // 参考链接 https://developer.android.com/develop/connectivity/cronet/start#kts
    //
    implementation("com.google.android.gms:play-services-cronet:18.0.1")

如何使用

整体使用方式与 okhttp 使用方式保持一致。只是多了一个 CronetEngine 的创建工作。

构建唯一的 CronetEngine

具体的 api 说明请参考 Cronet

kotlin 复制代码
    // cronetEngine 需要要保持全局唯一性,不可重复创建
    private val cronetEngine: CronetEngine by lazy(LazyThreadSafetyMode.NONE) {
        val httpCacheDir =
            File(this.applicationContext.externalCacheDir ?: this.applicationContext.cacheDir, "http")

        if (!httpCacheDir.exists()) {
            httpCacheDir.mkdir()
        }

        CronetEngine.Builder(
            NativeCronetEngineBuilderImpl(this.applicationContext)
        )
            .setStoragePath(httpCacheDir.absolutePath)
            .enableHttpCache(CronetEngine.Builder.HTTP_CACHE_DISABLED, 1048576)
            .enableHttp2(true)
            .enableQuic(true)
            .setThreadPriority(-1)
            .enableBrotli(true)
            .build()

GET

kotlin 复制代码
    // 创建 CronetClient
    val cronetClient = CronetClient.Builder(cronetEngine).build()

    // 构建 Request
    val request = Request.Builder()
        .url("https://www.fastly.com/quic-http-3")
        .get()
        .build()

    // 同步方式发起网络请求
    cronetClient.newCall(request).execute()

POST

kotlin 复制代码
    // 创建 CronetClient
    val cronetClient = CronetClient.Builder(cronetEngine).build()

    // 构建 RequestBody
    val body: RequestBody = "jsonString".toRequestBody()

    // 构建 Request
    val request = Request.Builder()
        .url("https://www.fastly.com/quic-http-3")
        .post(body)
        .build()

    // 同步方式发起网络请求
    cronetClient.newCall(request).execute()

混淆

你需要增加 cronet 的混淆规则。如果你是用 Google 官方提供的版本,则会自动包含。

Thanks

okhttp

cronet-transport-for-okhttp

相关推荐
闲暇部落27 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
C++忠实粉丝1 小时前
计算机网络socket编程(3)_UDP网络编程实现简单聊天室
linux·网络·c++·网络协议·计算机网络·udp
诸神黄昏EX2 小时前
Android 分区相关介绍
android
大白要努力!3 小时前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
C++忠实粉丝3 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
Estar.Lee4 小时前
时间操作[取当前北京时间]免费API接口教程
android·网络·后端·网络协议·tcp/ip
蝶开三月4 小时前
php:使用socket函数创建WebSocket服务
网络·websocket·网络协议·php·socket
Winston Wood4 小时前
Perfetto学习大全
android·性能优化·perfetto
G丶AEOM4 小时前
SSL/TLS,SSL,TLS分别是什么
网络·网络协议·网络安全
Koi慢热5 小时前
路由基础(全)
linux·网络·网络协议·安全