【ArchSummit】如何通过AIOps推动可量化的业务价值增长和效率提升?>>> 了解详情
写点什么

爱奇艺 App 启动优化实践分享

  • 2020-01-03
  • 本文字数:2895 字

    阅读完需:约 9 分钟

爱奇艺App启动优化实践分享

性能优化一直都是各个 APP 推进中的重点、难点,爱奇艺 App 也不例外。在此之前,爱奇艺 App Android 版的启动速度虽然一直处于同类 App 领先的水平,但优势距离其他同类的 APP 距离一直很小。面对这一瓶颈,爱奇艺技术产品团队为爱奇艺 App 的启动优化搭建了专项团队。在各个团队的大力支持下,将启动时间由 1.5s 优化到了 0.5s,实现了巨大跨越,下文将分享爱奇艺 App 启动的优化实践。

本文长度为 2914 字,预估阅读时间 8 分钟。

凡事预则立,不预则废

关于 App 的启动优化, 大部分的技术同学第一反应是延迟执行任务,再通过做一些代码实现上的优化来提高代码的执行效率。爱奇艺 App 早期的优化策略也是如此:将某些启动阶段不必要执行的任务延迟到首页某个生命周期之后再执行,或是延迟固定时间之后再执行等等。


这一优化策略在前期的确有一些效果,但是后来就收益甚微了。爱奇艺 App(Android)经过多年的稳定迭代, 功能不断丰富,代码量也越来越庞大。启动阶段涉及了很多业务的初始化功能,业务之间又有着复杂的依赖关系,轻易变更代码执行时序可能会导致崩溃或者某些业务异常。之前简单的延迟优化策略已经很难再取得收益,一种全新的优化方案已经迫在眉睫。

工欲善其事,必先利其器

有没有一种工具能直接看到当前任务执行的瓶颈呢?做过 Android 性能优化的同学应该都会比较熟悉 Systrace 和 TraceView 这两款工具。但是这还不够,我们需要一款更为直观、便捷的工具。它能够把启动阶段代码执行的先后顺序、时间间隔、线程情况以及代码位置等信息直观的展示出来,让我们能一眼看出某一阶段的任务调度是否合理,然后再根据实际情况进一步做有针对性的优化。


但到目前为止,我们尚未发现业内有满足此需求的现成工具。然而在一年前,我们团队自主开发了一款 Lens 开发调试工具,它能够以 SDK 的形式接入任意的 Android 应用程序,可以提供任务分析、网络分析(抓包)、页面分析(视图拾取、视图层级等)、沙盒访问、快捷入口等等功能。于是我们团队经过讨论,决定用 Lens 来实现任务分析的功能,这样既能完成启动优化,又能进一步完善 Lens 的功能。经过我们团队持续不断的完善和优化,突破重重技术难关。终于实现了可以直接看见任务的执行状况的能力,就像医生拿到了病人的 CT 报告,精准优化已准备就绪。



优化前启动耗时与线程信息(Debug)



优化前启动任务情况(Debug)



优化前启动任务执行时序(Debug)


诊断:启动阶段有大量的线程启动,执行了大量的任务,并且主线程任务十分密集。


经过充分的思考后,我们团队给出了如下的优化方案:


  • 任务化:将启动阶段的代码按照业务逻辑封装成独立任务,方便管理和调度。

  • 并发:将启动阶段的任务尽量并发执行。

  • 延迟:启动阶段只执行第一个页面渲染展示的必要任务,延迟的任务将在第一个页面渲染完成后再进行合理的调度触发。

  • 兜底:设计兜底机制,保证程序稳定执行。

  • 监控与优化:建立常态化监控机制,监测任务变化情况,实现精准优化。


由于启动阶段的任务之间存在相互依赖关系,被依赖任务会出现异步执行未完成而导致的崩溃问题。为了解决这一问题,一种基于依赖关系来动态调度任务执行的任务管理器——《TaskManger》被设计出来。


TaskManager(后文简称 TM)支持给任务设置执行条件,例如等待某个任务执行完成后或者某个事件发生后再开始执行;支持“关系与”依赖、“关系或”依赖,支持延时执行,支持把任务提交到主线程或者子线程执行等等。除此之外,任务之间还能传递数据,监听事件等等。


一、任务化

我们重新梳理了 Application 阶段的代码,并按照功能业务归类整理,提炼出了多个任务模块。例如,我们将播放器部分的初始化工作封装在 PlayerInitTask 类中。每个任务类都分为任务注册与任务执行两个部分,依据程序是否会启动页面展示,我们设置了不同的任务执行策略。


PS:灵活的任务执行时机设置也是 TM 的一大优点。


二、并发与线程收敛

在完成启动业务的梳理和重构之后,将可以在子线程中运行的任务提交到子线程中执行,将之前比较耗时的任务分拆为多个子任务,阻塞并发执行,从而尽可能的充分利用 CPU 的算力。


并且将启动阶段的任务都对接到了 TM 统一调度,避免其它线程抢占 CPU 资源以及一些不必要的系统开销问题,完成了启动阶段线程的收敛。通过采取这些措施启动阶段的线程数明显降低,主线程因为子线程抢占 CPU 资源而导致的执行效率过低的问题也得到了解决。


三、延迟

在启动阶段主要设置了两个事件:广告展示事件和首页展示事件。按照业务执行的必要性,我们把启动阶段不必要执行的任务分别延迟到了这两个阶段之后执行。任务之间也按照之前梳理的依赖关系,分别设置了相应的依赖条件,解决了因被依赖任务被延迟未执行而导致的崩溃或业务异常问题。TM 还 提供了一些运行监测机制,能有效避免循环依赖问题的发生。


由于 TM 的调度管理,这些任务在运行条件得到满足后会根据当前运行条件与设置的任务优先级等情况合理调度执行,不会出现大量任务同时并发执,从而导致页面卡顿的问题;

四、兜底

当任务延迟后,任务执行时机存在不确定性。这可能导致在业务需要时,一些初始化任务还没有执行完成的问题——TM 提供了任务兜底机制。


使用上面的 API 可以保证业务依赖的任务一定被执行,从而解决了因为“异步”与“延迟”可能给业务带来崩溃或者逻辑异常问题。

五、监控与优化

1)阻塞等待监控


由于 TM 提供了任务的兜底机制,理论上就会存在因业务需要而导致等待任务执行完成的场景产生。这种问题在低端设备上更为常见。为了解决这一问题,我们在 TM 中添加了任务等待监控功能,将其纳入常态化的监控中,并且成功发现了多项阻塞等待的问题。通过通知业务方进行逻辑优化,大大减少甚至避免了部分阻塞等待的问题,用户体验获得了更进一步的提升。


2)启动数据监控


我们将 Lens 的启动数据投递到后端,并且建立了启动分析日报机制。将启动过程分段,除了启动时间外,还投递了程序初始化阶段、页面创建阶段、页面渲染阶段的分阶段耗时数据,当某项数据明显劣化后,服务端就会发出预警。


3)历史版本启动任务对比分析


目前最新的 Lens 版本支持版本间启动任务对比分析功能,我们可以在界面上展示出两个版本之间的任务变化差异,例如新增任务、减少任务及运行耗时变化超出阈值的任务信息。通过分析这些变化的任务信息,就可以直接“约谈”相关业务方,进而快速的完成优化工作。



与此同时,我们团队还执行了一些其他的优化手段,例如推进代码执行效率的优化、提前加载一些重要展示数据等等。

总结

通过多个版本的迭代,完善了任务调度框架、启动任务常态化监控机制、任务分析功能等等。



优化后启动耗时与线程信息(Debug)


现已经优化到 500ms 以内,启动任务、启动阶段线程数也大幅度减少。在这次的优化实践工作中,Lens 与 TM 两个工具发挥了重要作用。关于 Lens 的细节,我们将在后续进一步为大家分享。


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-01-03 10:181169

评论 1 条评论

发布
用户头像
工欲善其事必先利其器。
2020-01-03 10:59
回复
没有更多了
发现更多内容

SD-WAN跨国网络加速的原理

Ogcloud

网络 SD-WAN 加速器

如何用ChatGPT分析恶意软件

高端章鱼哥

人工智能 ChatGPT

数仓调优实践丨多次关联发散导致数据爆炸案例分析改写

华为云开发者联盟

大数据 华为云 华为云GaussDB 华为云开发者联盟 华为云GaussDB(DWS)

高效的 Json 解析框架 kotlinx.serialization

不在线第一只蜗牛

Linux JSON库 解析

SD-WAN是怎样实现SaaS性能优化的?

Ogcloud

网络 SaaS SD-WAN WAN SaaS 平台

关于代码质量度量和分析的一些总结

不在线第一只蜗牛

SD-WAN架构:优化连接以提升性能

Ogcloud

架构 网络 SD-WAN

JNPF低代码——全源码、免费部署的开发框架

互联网工科生

低代码 应用开发 JNPF

悦数图数据库 | 图技术在金融风控中的应用选型建议

悦数图数据库

光伏储能数据难题很棘手?架构升级很迷茫?来看三大真实案例

TDengine

tdengine 时序数据库

业内首份!工业领域数据安全政策汇编发布(附下载)

极盾科技

数据安全

云电脑:DPU简介及分析

天翼云开发者社区

云计算 云电脑

即拍即改!合合信息旗下扫描全能王推出首个移动端图片文字编辑功能

合合技术团队

合合信息 #科技 #人工智能 扫描全能王

线上业务优化之案例实战

EquatorCoco

优化 优化工具 线上业务

HarmonyOS:NativeWindow 开发指导

HarmonyOS开发者

HarmonyOS

软件测试/测试开发丨人工智能算法基本原理,如何解决实际的问题

测试人

人工智能 软件测试

小程序开发必读:小程序跳转外部的功能盘点

FN0

小程序

TiDB 7.5 LTS 发版,提升规模化场景下关键应用的稳定性和成本的灵活性

编程猫

铭文市场火出圈,XRC-20有望继续演绎铭文市场神话

大瞿科技

软件测试/人工智能丨计算机视觉场景下如何开展相关测试活动

测试人

人工智能 软件测试

FxFactory 8 Pro for Mac(视觉特效处理包)v8.0.11永久激活版

mac

苹果mac Windows软件 FxFactory 8 pro 视觉特效软件包

软件测试/人工智能丨常见的计算机视觉的业务场景有哪些?

测试人

人工智能 软件测试

案例实践:某券商从 Neo4j 迁移至悦数图数据库

悦数图数据库

图数据库

云桌面还能这么建?

青椒云云电脑

桌面云 云桌面 云桌面解决方案

采购AI数字人 SaaS系统源码重点关注什么?

青否数字人

京东商品详情数据接口(JD.item_get)

tbapi

京东API接口 京东商品详情接口 京东商品数据接口

用户首选!满意度第一!

天翼云开发者社区

云计算 云服务 云平台

云电脑架构设计的层次

天翼云开发者社区

云计算 云电脑架构

演唱会真假难辨?一招揭密声纹技术丨ZA科技事儿

ZA技术社区

大数据 AI 声纹识别

桌面云解决方案

青椒云云电脑

桌面云 云桌面 云桌面解决方案

AI数字人直播能力堪比真人涌入直播大军!

青否数字人

爱奇艺App启动优化实践分享_大数据_奇创院_InfoQ精选文章