云音乐Android Cronet接入实践_onet弱网 云音乐me01使用说明

云音乐Android Cronet接入实践_onet弱网public abstract void onRedirectReceived(UrlRequest var1, UrlResponseInfo var2, String var3)

公共抽象无效onRedirectReceived(UrlRequest var1,UrlResponseInfo var2,字符串var3)

公共抽象无效onResponseStarted(UrlRequest var1,UrlResponseInfo var2)

公共抽象无效onReadCompleted(UrlRequest var1,UrlResponseInfo var2,ByteBuffer var3)

公共抽象无效onSucceeded(UrlRequest var1, UrlResponseInfo var2);

公共抽象无效onFailed(UrlRequest var1, UrlResponseInfo var2, CronetException var3);

这两个拦截器主要处理核心网请求的所有后续细节,不需要适配。

2. 调整事件监听器

Cronet有自己的回调,但是okhttp事件监听器依赖的一些回调(connectEnd、dnsEnd等)是在这两个拦截器上调用的。

公共抽象无效onRedirectReceived(UrlRequest var1,UrlResponseInfo var2,字符串var3)

公共抽象无效onResponseStarted(UrlRequest var1,UrlResponseInfo var2)

公共抽象无效onReadCompleted(UrlRequest var1,UrlResponseInfo var2,ByteBuffer var3)

公共抽象无效onSucceeded(UrlRequest var1, UrlResponseInfo var2);

公共抽象无效onFailed(UrlRequest var1, UrlResponseInfo var2, CronetException var3);

但是,它不如okhttp 事件监听器提供的那么全面。如果需要完全实现okhttp事件监听器,则需要修改Cronet的主要请求点并将其暴露给Java层。考虑到成本和使用场景,我没有这样实现。我们将更改这部分,但直接使用Cronet 的回调作为桥梁来实现一些核心事件侦听器回调。

3. 调整超时逻辑

企业指定请求超时来实施某种策略也是很常见的,但由于Cronet 不提供超时相关的API,链接构建超时和读取流超时等功能我们开发了。

void CronetURLRequest:SetOriginRequestID(uint32_torigin_request_id)

void CronetURLRequest:SetConnectTimeoutDuration(uint32_t connect_timeout_ms)

然后通过jni暴露给Java层,通过适配层桥接到Okhttp接口。

CronetUrlRequest.java 类

mRequestContext.onRequestStarted();

if (mInitialMethod !=null) {

if (!nativeSetHttpMethod(mUrlRequestAdapter, mInitialMethod)) {

throw new IllegalArgumentException(\’无效的http方法\’ + mInitialMethod);

}

}

if (mRequestId 0) {

NativeSetOriginRequestID(mUrlRequestAdapter, mRequestId);

}

//将业务侧设置的超时时间传递给Cronet

if (连接时间0) {

NativeSetConnectTimeoutDuration(mUrlRequestAdapter, (int) connectTime);

}

//将业务侧设置的超时时间传递给Cronet

if (读取时间0) {

NativeSetReadTimeoutDuration(mUrlRequestAdapter, (int) readTime);

}

这样上层业务方就可以继续使用Okhttp原有的功能,无需做任何改动。

网络请求适配

1. 尺寸适配请求

在发起请求时,需要将原来通过Okhttp内置拦截器发起的请求切换为使用Cronet发起请求后,对Okhttp和Cronet接口之间的请求和响应进行适配转换。

网络请求切换图

同时,由于之前的一些Java层网络策略是用C++实现的,所以我们在CronetUrlRequest的基础上,扩展了之前Java层的一些直接调用和参数,开放了对Cronet的jni调用。

2.全局调用适配

迁移到C++ 的网络策略以C++ 中独立插件的形式存在,以便尽可能与Cronet 的原始代码解耦。 Java端通过CronetRequestContext配置到C++端,然后分发到相应的注册组件。此链接包括对JsBridge 的代码更改,以减少后续网络策略的开发和维护成本。正在采用诸如“CppBridge”之类的方法来协议方法调用并通过JSON 在Java 和C++ 之间传输数据,从而允许后续集成到插件和C++ 策略中,该更新避免了Java 到C++ 请求链接的繁琐开发工作。动态配置是通过Java层的配置中心功能来执行的。

解决问题

1. 线程优化

如您所知,网络请求必须在子线程中发起。 Cronet的官方文档建议传递一个负责执行网络请求的Executor。

这种情况下,子线程的执行环境已经在okhttp拦截器内部了。留下独立的执行器对会导致不必要的线程切换和时间消耗。查看Cronet源代码,发现CronetHttpURLConnection使用的MessageLoop类的实现是在当前线程中。使用MessageLoop减少了不必要的冗余线程的引入。

通过MessageLoop的请求的生命周期

2. 兼容分辨率

在不同的网络库之间切换时,兼容性问题是不可避免的。它也遵循http协议,但如果某些边界条件的处理严格程度不一致或不同,可能会出现兼容性偏差。由于篇幅限制,我们在这里只介绍一些兼容性点。

Cronet 库将http 连接数设置为6。如果某个http请求使用不当,比如异常持有或者不释放,一旦达到6,后面的请求就会被阻塞,直到前面的连接资源被释放。 http1 .1很容易触发。如果请求体中没有设置Content-Type,则直接抛出异常。

if (!hasContentType) {

throw new IllegalArgumentException(\’包含上传数据的请求需要Content-Type。\’);

}

在某些特殊配置中,如果请求体中没有设置Content-Type,则请求中会直接抛出异常。

Cronet请求返回4xx时,直接抛出异常,而okhttp则将结果和代码返回给上层,交给用户处理。

兼容性优化没有统一的解决方案,通常可以通过保证兼容性或者鼓励优化不合理的代码来解决。

3.解决重定向问题

如果HTTP请求被重定向,则必须使用新的目标主机地址更新请求标头中的Host字段。否则,如果服务器确定Host 字段与请求的主机实际上不匹配,则服务器将拒绝该请求。首先我们看一下Okhttp是如何实现这个功能的。

okhttp RetryAndFollowUpInterceptor 类中,302 触发请求对象的重建:

接下来,使用BridgeInterceptor 重置主机。

Android 端Cronet 的默认实现不会更新此内容。检查cronet 代码。

类:cronet_url_request.cc

事实证明,cronet的下层接口支持修改重定向时传递的标头,但默认情况下它们传递为空,并且没有暴露给Java端进行配置的接口。

解决方案:开放cronet重定向时更新标头的功能,并添加新的配置接口。

无效CronetURLRequest:NetworkTasks:SetRedirectHeader(

const std: 字符串键,

const std: 字符串值) {

DCHECK_CALLED_ON_VALID_THREAD(network_thread_checker_);

DCHECK(url_request_.get());

if (redirect_request_headers_==base:nullopt) {

redirect_request_headers_=base:make_optionalnet:HttpRequestHeaders();

}

redirect_request_headers_-SetHeader(key, value);

}

在重定向期间,会传递从Java 端设置的标头。

@覆盖

protected void handleRedirectReceived(UrlRequest request, UrlResponseInfo info, String newLocationUrl) {

尝试{

Uri newUri=Uri.parse(newLocationUrl);

字符串主机=newUri.getHost();

//更新主机

request.setRedirectHeader(\’主机\’, 主机);

request.followRedirect();

} catch (异常e) {

e.printStackTrace();

}

}

当cronet 执行FollowDeferredRedirect (实际的重定向方法)时,它会用重定向标头中传递的方法替换原始方法。

无效CronetURLRequest:NetworkTasks:FollowDeferredRedirect() {

DCHECK_CALLED_ON_VALID_THREAD(network_thread_checker_);

#如果定义(WOW_BUILD)

url_request_-FollowDeferredRedirect(

this-redirect_request_headers_ /*modified_request_headers */);

除此之外

url_request_-FollowDeferredRedirect(

Base:nullopt /*modified_request_headers */);

万一

}

灰度上线

切换网络库涉及您业务的方方面面,因此您上网时需要特别小心。

在预上线开发阶段,我们主动将开发环境切换到Cronet,以便出现问题时能够第一时间发现。

为了保证Cronet SDK的稳定性,我们结合稳定性平台和舆情信息反馈观察,在灰度阶段重复进行再利用验证。

技术上,为了防止其他异常情况导致网络不可用,非网络抖动导致的网络请求异常会自动降级为Okhttp,并在一定次数后完全降级为Okhttp,并上报日志。粒度是动态的,以便网络组件可以按需更新/打开和关闭,从而最小化网络组件进行分析,并将网络请求的每个阶段的全面的端到端数据嵌入设置为。

上线后,我们会延长观察期,并逐步增加量。反复比对各方面的网络性能数据,及时分析识别异常数据,确保数据完全正向。分析的维度包括:

首包期/请求期错误率长尾数据分析业务体感数据该阶段通常是从数据侧发现问题并根据相应的业务场景进一步识别之后。在针对不同具体错误类型运行流程的同时,我们还发现了一些由于上层使用异常导致的错误率问题,并进行了优化,降低了部分场景的错误率。

目前,Android Cronet已完整稳定上线一年多,统计显示主站API请求时间优化16%,错误率优化4%,CDN请求进行各级优化。跑步。域名也进行了不同程度的优化。

后续规划

针对弱网场景的专项优化在业务发展中经常出现。云音乐是基于Cronet的nqe模块进行二次开发,提供外部弱网检测和通知功能(正在进行中)。

尾声

最后,再次强调,如果你想成为一名优秀的Android 开发人员,请重点深入研究基础知识和重要的事情。

对于很多初级和中级的Android工程师来说,如果想要提高自己的技能,往往需要自己去探索和成长,不系统的学习效果是低效、耗时、无益的。 希望这些架构技术能够对各位Android开发朋友有所帮助,帮助他们少走弯路。本文的重点是你获得了什么,无论你是否成长。别的都无所谓。

在此分享作者整理多年建筑经验创作的从建筑哲学角度分析的视频和资料。我想这个视频会给你带来很多启发。

Android进阶学习资料库

总共10个专题,包括所有Android进阶学习资料、Android进阶视频、Flutter、Java基础、Kotlin、NDK模块、计算机网络、数据结构与算法、微信小程序、面试题分析、框架源码都有。

我整理了多年的建筑经验,并在过去的六个月里准备了更新的记录。我们相信这个视频会给您带来各种启发和好处。

[外部链接图像正在传输.(img-l6nqCYaC-1720119035901)]

Android进阶学习资料库

总共10个专题,包括所有Android进阶学习资料、Android进阶视频、Flutter、Java基础、Kotlin、NDK模块、计算机网络、数据结构与算法、微信小程序、面试题分析、框架源码都有。

[正在传输外部链接图像.(img-aMocaVWV-1720119035901)]

以上#云音乐源网络Android Cronet接入实践_onet相关内容,弱网信息请参考官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/93025.html

(0)
CSDN的头像CSDN
上一篇 2024年7月5日
下一篇 2024年7月5日

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注