奇异果投屏的进化之路

笔者按:奇异果投屏伴随奇异果TV一路发展至2022年,日活用户已达300多万,用户和我们都对投屏的功能和性能提出了更多的诉求和更高要求,因此2022开始系统地对投屏功能和性能做了扩展和优化。本文立足于TV端,为大家介绍爱奇艺站内投屏优化过程中面临的困难和解决方案,虚心以待您的指正和建议。

01

   优化历程回顾

自2022年初接手投屏功能,先后开展了功能扩展、报障处理提效等工作,至2022年底仍深感投屏功能迭代和问题处理效率不高。投屏功能作为连接手机和电视的桥梁,对其可靠性、稳定性有着很高的要求,夯实基础才能行稳致远,因此开启了投屏优化的历程,针对投屏服务不稳定、线上数据不可用、线上报障解决效率低这三大问题寻求彻底的解决方案。

问题一:投屏服务不稳定

投屏服务为了最大化的保证可用性,需要独立于客户端进程存活,因此采用子进程启动;为了更灵活的迭代以及修复线上问题,需要可以独立部署升级,因此采用独立插件的方式。历史版本的投屏服务架构虽然能够支撑以上两点,但是采用的单服务方案(投屏服务通过ModuleManager注册到客户端),无法很好地支持投屏的双向通信稳定性、投屏服务监测与保活。

17ee207d1a0eb71c3729d43b791e776f.png

新方案采用双服务设计,基于Android系统的Binder机制,可以稳定可靠的感知对端状态并监测连接状态。同时使用Bind和Start两种方式启动Service,提升投屏进程优先级以达到更好的保活效果,进而提供更稳定的双向通信能力。

78d22a4ab8c3f1048af06a9b8e9091d8.png

问题二:线上数据不可用

旧的投屏服务架构,数据打点无法覆盖全流程,导致上报数据不完整,无法监控投屏服务线上质量,更无法分析、解决线上问题。

新的投屏服务架构,设计了3个层级投递监控:

  • 投屏服务模块运行及可靠性监控

  • 投屏协议启动及结果

  • 推片链路步骤打点

每个层级建立相应的业务会话Session机制,每次业务过程生成唯一的SessionId作为会话标识,串联整个业务逻辑生命周期,在各关键节点上报对应业务数据,作为线上数据分析的基础。

  1. 投屏服务模块

此层级的设计目标,确保并提高投屏整体可靠性,服务功能及进程保活,重试重连等数据收集。

该模块完成了线上设备进程保活状态信息的收集,暴露并验证了旧架构不稳定的原因,在新版本上针对性进行规避。如:

数据反馈暴露出的问题

规避和改进方案

startService方式启动子进程,进程优先级较低,进程易被回收并产生频繁重启

加入Bind方式,提升进程优先级

低性能设备进程启动时间长,高版本Android会触发ANR异常(未及时调用Service.startForeground)

Bind方式启动Service,成功后再追加startService

插件机制实现缺陷,丢失bindService的flag参数的进程优先级控制,导致子进程被回收

插件模式下,放弃子进程方式,将投屏服务运行在主进程

部分Rom的LMK机制较严厉,内存紧张时,为保活优先级较高的子进程,可能kill前台可见的主进程

对有问题的设备,放弃子进程方式,投屏服务转为主进程方式

  1. 投屏协议启动

投屏服务的核心功能点在协议层与网络层,此层级设计目标,启动投屏协议模块并跟踪结果,监听系统网络的变更,适时重启投屏协议模块以确保新网络下投屏业务可用。

该模块经过验证和完善后,完成了投屏协议启动的监控及失败原因的统计,并收集汇总线上各设备的网卡及连接信息、协议启动失败在各入口场景下的分布,为分析及提高协议启动成功率提供了源数据及优化回馈。线上分析及存在的问题解决如下:

数据反馈暴露出的问题

规避和改进方案

网络变更场景,协议启动成功率低

正常情况,网络变更时设备网络本就处于不稳定状态,暂无法避免

进程后台存活,设备休眠与激活,导致网络关闭与开启,会频繁触发网络变更重启协议模块,刚激活时网络未准备好

延时处理网络变更事件,可规避部分异常场景,但这个延时无法精准,不能完全避开网络未准备好的时间段,且无法处理激活时间较短又休眠的场景

依据启动时网卡及IP的存在状况,尝试排除无IPv4的启动失败

某些设备双网卡同时连接,WIFI频繁触发断开重连,投屏协议模块频繁重启失败率走高

优化网卡选择策略,优先选择系统活跃网络类型的网卡,避免因交替选择不同网卡频繁重启协议模块

某些设备获取系统活跃网络失败或无,实际上网络可用,收到一些无网络错误码的投递

优化网卡选择策略,系统活跃网络仅作为参照,网卡及IP状况可用时,继续启动协议模块

  1. 推片链路环节

此链路包括TV端收到推片请求,数据与本地能力核验,预缓存起播数据,拉起界面进行播放,记录各阶段及首帧渲染耗时等。

通过该层级统计数据,可分析Qimo投屏和DLNA投屏在各环节点失败折损,阶段耗时占用,起播成功率及起播耗时等。推片环节优化点如下:

数据反馈暴露出的问题

规避和改进方案

跨进程拉起中的链路折损

跨进程拉起进行设备适配,切换到主进程方式,避免拉起新进程

Activity启动阶段的链路折损

后台Activity启动折损,系统限制无法避免,通过引导用户提前打开奇异果应用规避后台拉起的场景

首帧渲染处的链路折损

首帧渲染率与播放成功率有关,与推片的资源相关,无法在推片链路层面解决

Qimo投屏起播耗时优化

针对Qimo投屏场景,优化删减链路环节中的接口调用,与爱奇艺App协调,增加必要的信息字段,避免推片时再请求接口

  1. 投屏指标体系

建立投屏质量体系看板,关注新版本上线后各重要指标的趋势变化,及与旧版本之间的同期对比。其中包括投屏服务的启动成功率、投屏协议启动成功率、Qimo推片起播平均耗时等

a4b924624f514212c9b1529b191bc94f.png

  1. 问题发现与分析示例

5.1 投屏协议SDK启动失败及优化过程
1) 问题发现

每次发版初期,投屏SDK成功率会习惯性的跌入90%以下,如下图

9c37377d6f04c734c764454ffdf403ab.png

2) 分析原因

事出反常必有因,分析问题时间段内投屏SDK启动的投递数据,以设备维度归集后排行,发现SDK启动失败问题有如下特征:

  • 设备型号相对集中,MagicBox_M20C/A两款贡献80%错误量

  • 设备ID相对集中,频繁触发,2款型号触发问题的设备ID仅占其DAU的3-4%

复现遇到难点:

  • 测试设备库无两款设备

  • 都是较老型号,已无法采购设备

只能深入分析个例设备的投屏服务启动及协议启动投递数据序列,以期寻找到共性,抽查几个比较严重的设备id,发现:

  • 失败发生时,系统活跃网络是有线,同时连着wifi,wifi频繁发送变更通知

  • 协议启动时交替选择eth0和wlan0,网卡有变更导致频繁重启SDK,产生巨量启动失败数,间隔最短能到6s每次

  • 异常的设备数量不多,但产生的异常数据量很大

由此推断问题发生场景:

  • 有线网卡和无线网卡都连接的情况下,天猫魔盒M20A/C该2款设备ROM会频繁(间隔<5s)通知WIFI网络断开或重连

  • 奇异果旧选网卡策略是优先选取wifi网卡,此场景会交替使用有线网卡和无线网卡,重新启动投屏SDK

  • 此时处于网络变更期间,网卡状态不稳定,频繁的启动加大了投屏SDK启动失败的概率

3) 优化方案及数据验证

升级调整选网卡策略,增加新的选网卡策略,并支持云配切换新旧策略功能,方便不同策略的数据对比:

  • 优先选取系统活跃网卡

  • 有线网络优先于WIFI

支持新选网卡策略的版本上线后,云配控制M20A/C设备的新版本选网卡策略,如下图橙线(v13.6)走势,投屏SDK成功率明显拐点上行,云配生效后(红色圈)止住下跌趋势,证明新策略有效,之后版本曲线不再出现严重(<90%)的下探

d5a1aa71549566ce0464f38473a6b410.png

5.2 投屏SDK启动无网络错误码占比偏高
1) 问题发现与分析

版本全量后,投屏SDK成功率仍在98%左右徘徊,离目标99%仍有距离;为此,需要聚焦错误原因,解决错误数据大头,快速提升投屏SDK成功率。

282f1ba182b9ac765e12a3a3994947ac.png

搜集投屏SDK启动数据,以设备维度聚合,按各类错误总数逆序排行表,发现:

  • Top10中,索尼占据了9席,比较典型

  • 从错误类型看,无网络错误占比较大,相应原因是获取系统当前活跃网络出错或无网络

2) 优化方案及数据验证
  • 更改有无网络的判断依赖,系统活跃网络仅作为参照项,检测失败不阻碍后续启动

  • 判断网卡IP作为兜底,如果网卡存在合适IP,可忽略系统活跃网络

新版本上线后,针对该批设备云配网络判断策略,40款设备收集线上修改前后数据进行对比验证如下:

  • 10款型号(涉及sony和小米),错误数/率下降 90%+,效果显著

  • 9款型号,错误数/率下降 50%+,效果明显

  • 10款型号,错误数/率下降仅20%+,效果一般

  • 4款型号,效果低于/接近10%,效果不明显

  • 6款三星设备,未升级覆盖,几乎无效

应用新策略后,全量后整体无网络错误率下降一半左右。如下图,红框所示的版本全量区域,13.7/13.8对比13.6同期优化幅度近50%,红圈区域为应用新策略时间段13.6的错误率下降趋势.

fabd58cdc3afea6fdf764acdbf7f2ebb.png

此次适配优化后,版本全量后,投屏协议启动成功率可达98.5%+

16d547480a42a8c3978003212b96be02.png

问题三:投屏线上报障解决效率低

  1. 困难与对策

困难描述

影响范围

解决方案

TV端日志不全

缺少关键日志,无法定位问题

新投屏服务架构完善了投屏进程的日志上报功能,基于新的日志体系,能够补充更多关键日志

只有单端日志

无法支持双端联合分析

增加移动端投屏报障联动功能,即移动端投屏报障会给TV发指令追加一份TV日志到同一工单;找不到TV设备的问题,协同客服同学引导用户双端报障

只能收集到应用内的日志,无系统日志

无法分析系统行为

暂时无法解决,只能尽量增加应用调用系统接口的日志

只能个案分析

个案问题基本上没有共同特征,无法归纳分析并解决;而且无法判定影响程度

结合线上数据协同分析,尝试解决一类问题,而不是一个问题

扩展发现设备的途径,增加局域网扫码投屏功能,优化网络抖动等网络不稳定原因导致的无法找到TV设备

扩展通信通道,增加远程投屏,建立广域网通信通道

  1. 批量分析方法

关联质量投递数据,建立用户报障批量分析流程,提升用户反馈分析效率,流程如下图

c98be57ccb6b88e48c6ba387281bf460.png

02

   未来可期

总结过去是为了更好的创造未来。经过多团队共同努力,至2023年底,投屏功能在稳定性(99%+)、成功率(98.5%+)、可监控等方面取得了阶段性的成果,为投屏功能的进一步发展、创新打下了坚实的基础。

投屏的未来何去何从?电视作为家庭娱乐中心的地位短时间还不会被轻易撼动,手机作为个人不可或缺的贴身设备,短时间也很难找到替代品,投屏作为连接手机和电视的桥梁,未来目标是实现1+1>2的效果:

  1. 各取所长:

    1. 电视的观影体验更好(大屏、高画质、好音效),但是操控不够便捷;

    2. 手机的操控便捷,但是观影体验不如电视;

  2. 开疆拓土:打破边界、拉近距离,会产生更能多可能性。

    1. 远程投屏:将手机与电视的互动从局域网扩展到广域网,延伸了投屏的边界,同时拉近了人与人的距离,让你的手机可以连接父母的电视;

    2. 万物互联:物联网作为当下科技创新大潮中的一员,已经崭露头角。电视作为家庭的中心,手机作为个人的的延伸,已经通过投屏建立了连接,随着更多家用设备接入物联网,一定能借由投屏这座桥产生更多可能性。

未来已来,愿与大家共同努力创造爱奇艺投屏新生态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/379635.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

百家cms代审

环境搭建 源码链接如下所示 https://gitee.com/openbaijia/baijiacms 安装至本地后 直接解压到phpstudy的www目录下即可 接下来去创建一个数据库用于存储CMS信息。&#xff08;在Mysql命令行中执行&#xff09; 接下来访问CMS&#xff0c;会默认跳转至安装界面 数据库名称和…

spring boot(2.4.x 开始)和spring cloud项目中配置文件application和bootstrap加载顺序

在前面的文章基础上 https://blog.csdn.net/zlpzlpzyd/article/details/136060312 spring boot 2.4.x 版本之前通过 ConfigFileApplicationListener 加载配置 https://github.com/spring-projects/spring-boot/blob/v2.3.12.RELEASE/spring-boot-project/spring-boot/src/mai…

ElasticSearch之search API

写在前面 本文看下查询相关内容&#xff0c;这也是我们在实际工作中接触的最多的&#xff0c;所以有必要好好学习下&#xff01; 1&#xff1a;查询的分类 主要分为如下2类&#xff1a; 1:基于get查询参数的URI search 2&#xff1a;基于post body的request body search&am…

8868体育助力法甲巴黎圣日耳曼俱乐部 运作球员转会

法甲的巴黎圣日耳曼足球俱乐部是8868的体育助力球队之一&#xff0c;根据法国媒体RMC的消息&#xff0c;巴黎圣日尔曼仍然希望在一月份增强球队的后防实力。虽然之前球队已经从圣保罗引进了20岁的巴西中后卫卢卡斯-贝拉尔多&#xff0c;而这名小将也将会是巴黎圣日耳曼冬窗的一…

nodejs+vue高校实验室耗材管理系统_m20vy

用户功能&#xff1a; 登录后要有一个首页 比如:可以看见目前的耗材消耗记录&#xff0c;可做成图表菜单栏在左侧显示 1.个人信息管理 可以对基本信息进行修改&#xff0c;(修改密码时需要验证) 2.耗材管理&#xff08;耗材信息&#xff09; 普通用户可以查询当前相关耗材信息[…

Easy Excel动态表头的实现

步骤&#xff1a; 1.查找官方API文档理解实现 2.实现融入到代码里面 一&#xff1a;Easy Excel动态头实时生成头写入 动态头实时生成头写入 二&#xff1a;实现 目的&#xff1a;实现表头为&#xff0c;第一列是固定列&#xff0c;第二列为动态生成的时间段的每一天的日期…

【JAVA WEB】CSS

目录 CSS是什么&#xff1f; 基本语法规范 引入方式 内部样式表 行内样式表 外部样式表 常用选择器的种类 基础选择器 标签选择器 类选择器 id选择器 通配符选择器 复合选择器 后代选择器 伪类选择器 常用元素属性&#xff1a; 字体属性&#xff1a; 文本属性…

初始web服务器(并基于idea来实现无需下载的tomcat)

前言 前面学习了对应的http协议&#xff0c;我们知道了他是在网络层进行数据传输的协议&#xff0c;负责相应数据以及接收数据的规则&#xff0c;但是在人员开发后端的时候不仅仅需要你写io流进行数据传输&#xff0c;还需要你进行对应的tcp协议来进行数据打包发送http协议-CSD…

Elasticsearch: 非结构化的数据搜索

很多大数据组件在快速原型时期都是Java实现&#xff0c;后来因为GC不可控、内存或者向量化等等各种各样的问题换到了C&#xff0c;比如zookeeper->nuraft(https://www.yuque.com/treblez/qksu6c/hu1fuu71hgwanq8o?singleDoc# 《olap/clickhouse keeper 一致性协调服务》)&a…

安卓服务的常见问题,性能优化以及应用场景剖析

一、引言 在安卓开发中&#xff0c;服务&#xff08;Service&#xff09;扮演着至关重要的角色&#xff0c;它们在没有用户界面的情况下&#xff0c;为用户提供了长时间的后台任务执行能力。本文将探讨服务常见问题、优化策略、应用场景以及开发过程中应注意的事项。 二、应用场…

按键扫描16Hz-单片机通用模板

按键扫描16Hz-单片机通用模板 一、按键扫描的原理1、直接检测高低电平类型2、矩阵扫描类型3、ADC检测类型二、key.c的实现1、void keyScan(void) 按键扫描函数①void FHiKey(void) 按键按下功能②void FSameKey(void) 按键长按功能③void FLowKey(void) 按键释放功能三、key.h的…

Qt PCL学习(二):点云读取与保存

注意事项 版本一览&#xff1a;Qt 5.15.2 PCL 1.12.1 VTK 9.1.0前置内容&#xff1a;Qt PCL学习&#xff08;一&#xff09;&#xff1a;环境搭建 0. 效果演示 1. pcl_open_save.pro QT core guigreaterThan(QT_MAJOR_VERSION, 4): QT widgets// 添加下行代码&#…

npm 下载报错

报错信息 : 证书过期 (CERT_HAS_EXPIRED) D:\Apps\nodejs-v18.16.1\npx.cmd --yes create-next-app"latest" . --ts npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to https://registry.npm.taobao.org/create-next-app failed…

Qlik Sense : Lookup函数

LookUp - 脚本函数 Lookup() 用于查找已经加载的表格&#xff0c;并返回与在字段 match_field_name 中第一次出现的值 match_field_value 对应的 field_name 值。表格可以是当前表格或之前加载的其他表格。 语法&#xff1a; lookup(field_name, match_field_name, match_…

macOS Sonoma 14.3.1(23D60)发布

系统介绍 黑果魏叔2 月 9 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 14.3.1 更新&#xff08;内部版本号&#xff1a;23D60&#xff09;&#xff0c;本次更新距离上次发布隔了 17 天。 魏叔 查询苹果官方更新日志&#xff0c;macOS Sonoma 14.3.1 修复内容和 …

React环境配置

1.安装Node.js Node.js官网&#xff1a;https://nodejs.org/en/ 下载之后按默认选项安装好 重启电脑即可自动完成配置 2.安装React 国内使用 npm 速度很慢&#xff0c;可以使用淘宝定制的 cnpm (gzip 压缩支持) 命令行工具代替默认的 npm。 ①使用 winR 输入 cmd 打开终端 ②依…

常见云计算服务模式( IaaS基础架构即服务、PaaS平台即服务、SaaS软件即服务)

常见云计算服务模式 &#xff08; IaaS基础架构即服务、PaaS平台即服务、SaaS软件即服务&#xff09; 零、00时光宝盒 世界并不完美&#xff0c;面对很多事情我们都很无奈甚至悲哀&#xff0c;但生活总要继续下去&#xff0c;不止是为了自己。抱怨没有用&#xff0c;顾影自怜也…

涤生大数据实战:基于Flink+ODPS历史累计计算项目分析与优化(上)

涤生大数据实战&#xff1a;基于FlinkODPS历史累计计算项目分析与优化&#xff08;一&#xff09; 1.前置知识 ODPS&#xff08;Open Data Platform and Service&#xff09;是阿里云自研的一体化大数据计算平台和数据仓库产品&#xff0c;在集团内部离线作为离线数据处理和存…

华为第二批难题一:基于预训练AI模型的元件库生成

我的理解&#xff1a;华为的这个难道应该是想通过大模型技术&#xff0c;识别元件手册上的图文内容&#xff0c;与现有建库工具结合&#xff0c;有潜力按标准生成各种库模型。 正好&#xff0c;我们正在研究&#xff0c;利用知识图谱技术快速生成装配模型&#xff0c;其中也涉…

[C/C++] -- JSON for Modern C++

JSON for Modern C&#xff08;nlohmann/json&#xff09;是一个流行的 C JSON 库&#xff0c;由德国开发者nlohmann编写。这个库提供了简洁而灵活的 API&#xff0c;使得在C中解析和生成JSON数据变得非常方便。 1.JSON简介 JSON&#xff08;JavaScript Object Notation&…