【http3/quic】cronet 已经原生集成在Android内啦!还不快来开开眼!

前情提要

想要在 Android 上使用 http3/quic 协议的网络请求,通常需要使用三方库,例如okcronet

(ps: okhttp3 不支持 http3 哦,最高只支持到 http2,okhttp是内部完全自己实现的http协议,而不是用的系统的)

关于 Http3 协议的简介可以看这里HTTP3/QUIC 时代的来临,能给App带来什么?

前言:cronet是什么

cronetChromium(大家常用的Chrome浏览器的开源版) 中的网络堆栈,是C/C++编写的现代网络引擎,支持Http1\Http2\Http3所有协议,Google将其独立出来,提供了编译好的so文件供使用。其版本号跟随 Chrome 走。

Google 提供的 Cronet 成品仓库

但是 cornet 只是一个较为底层的网络引擎,直接使用起来并不方便,所有了okcronet这个封装库。

现在发车了,坐稳了

旧时代 Android 原生的网络请求?

众所周知,因为Android系统的原生网络请求很辣鸡,所以官方自己都放弃了,安卓developer基本都是依靠着第三方库VolleyokHttp等等过日子的。包括 cronet,也是一个支持新时代Http3协议的三方库罢了。

新时代 Android 原生的网络请求库!

惊奇发现

不多说,我们先看用法:

kotlin 复制代码
// 导入系统包
import android.net.http.HttpEngine


if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && 
    SdkExtensions.getExtensionVersion(Build.VERSION_CODES.S) >= 7) {
    
    // 构建系统内置的新版本 Http 请求引擎
    val engine = HttpEngine.Builder(application)
        .setEnableQuic(true)
        .setEnableHttp2(true)
        .setEnableBrotli(true)
        .build()
        
    // 发起网络请求
    engine.openConnection("https://xxxx.xxx.xxx")

}

有的同学会说了,"这乍一看,好像没什么特别的啊"。别急,我们来看下 cronet 的原始使用方式:

kotlin 复制代码
// 构建 cronet Http 请求引擎
val engine = CronetEngine.Builder(application)
        .setEnableQuic(true)
        .setEnableHttp2(true)
        .setEnableBrotli(true)
        .build()
        
// 发起网络请求
engine.openConnection("https://xxxx.xxx.xxx")

嘿~完全一模一样!

再点开 HttpEngine 的源码,会发现,所有的方法定义都是一模一样!!😂😂

赶紧写个 demo 把 HttpEngine 的网络代码跑起来看看日志:

less 复制代码
// vivo x100(Android 15) 上的日志
 I  Cronet version: 121.0.6167.71, arch: aarch64
 
// Android 16 模拟器上的日志
 I  Cronet version: 133.0.6876.3, arch: aarch64

嘿!实锤了!!!HttpEngine 就是系统内置的 cronet ❗️。好家伙,Google 这是在搞大事情啊。

但是

但是,不要急,上面可以看到,HttpEngine的使用是有版本限制的!

  • 系统版本必须大于等于 R ,也就是 Api30(Android 10)
  • 同时,R系统的子扩展版本需要大于等于 7

也就是说要 Android 10 的子版本为 7 以上的系统,为了使用安全,还是 Android 11 来界定吧。

然而

作为独立库的 cronet 对于此情况,已经做了适配处理了,一套api就搞定(本身HttpEngine就是cronet 😂)

scss 复制代码
val cronetEngineBuilder = if (isHttpEngineAvailable()) {
    // 如果系统版本满足,就使用 系统内置版本
    HttpEngineNativeProvider(HttpHelper.application).createBuilder()
} else {
    // 其他的就使用 so 库的版本
    NativeCronetProvider(HttpHelper.application).createBuilder()
}

尾声

趋势已来,Http3\QUIC 的时代已经到来了,不论是 cronet 还是原生的 HttpEngine,都是最好的体现。

Android系统的网络引擎摆烂,在多年的情况下,Google终于是捡起来了,把全球亿级用户量、高性能的chrome 网络引擎带了直接带到安卓上,我觉这是个很好的做法,只要chrome还活着,那么这个网络引擎就会一直迭代,减少了内部Android项目的开发成本。

也许以后,Android的网络三方库,都只是对系统库的封装了,类似于iOS一样。

也许以后okhttp会直接使用HttpEngine作为Http3协议的实现。

当然,你也可以使用 okcronet 作为你的选择,以保证所有系统版本的库的一致性。

相关推荐
xianrenli3843 分钟前
Android14自动时区更新
android·学习·framework·aosp14·自动时区
心中有国也有家44 分钟前
AtomGit Flutter 鸿蒙客户端:零外部资源的应用打包策略
android·javascript·flutter·华为·harmonyos
恋猫de小郭1 小时前
Fluter 共享内存多线程正在落地,IsolateGroupBound 来了
android·前端·flutter
三少爷的鞋1 小时前
Kotlin 协程的七重境界:从 launch(IO) 到执行模型设计
android
-SOLO-11 小时前
Android Event 日志完全指南
android
壮哥_icon12 小时前
【Android 系统开发】从掉帧卡顿到丝滑:高频硬件中断(IRQ)的 CPU 亲和性性能优化实战
android·性能优化
千里马学框架12 小时前
Android Framework 新手学习踩坑建议指南
android·智能手机·性能优化·framework·aaos·车载开发·系统工程师
我命由我1234514 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
狂奔solar15 小时前
ARMA 模型:从白噪声到万能逼近器
android
渣渣灰飞15 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第二章:RBAC 权限系统设计
android·学习·mysql