写点什么

优酷 Android 发现页冷启优化

  • 2020-05-18
  • 本文字数:1521 字

    阅读完需:约 5 分钟

优酷Android发现页冷启优化

一、背景

提到性能优化,跟页面相关的就两个指标:冷启动时长和页面 FPS 冷启动时长用来表征用户在首次打开页面时到页面渲染完成的耗时,很明显这个耗时越短,用户的体验将会越好。而 FPS 则表示页面渲染的帧率,FPS 越高,表示页面交互越流畅。所以我们的目标是:冷启动时长得低,FPS 得高,这样就表示用户能快速进入页面并且愉快的交互了。


随着业务复杂度的增加,发现页线上的冷启动耗时有点差强人意,于是就有了这一波发现页的冷启动优化。

二、思路

基于以前优化经验,迅速整理出了优化思路,并形成如下脑图:


三、优化结果

1)低端机自然冷启到页面渲染完毕进 1s,目前实验室数据 892ms,行业对比数据如下:



2)低端机 push 冷启到视频起播进 5s,优化前后对比效果如下:


四、主路径梳理

针对发现页,对其启动主路径梳理如下:



五、懒加载

依赖阿里中间件 AppMonitor 的页面完成的回调接口,通过将所有可以懒加载的任务用 MonitorTask 包装后抛给 PageMonitorTaskDomain 在合适的时机执行,如:当 page 处在可交互的状态时执行:


@Overridepublic void onPageChanged(final String name, final int state, final long l) {   if (state = INTERACTIVE) {      doDelayedTask();   }}
复制代码


几个主要的懒加载项:


1)Tab 动画;


2)Poplayer;


3)卡片推荐任务;


4)Viewpager 左右 Tab 懒加载;


5)各种业务(换肤、福利球等)。

六、预加载

创建预加载池,会在 Application OnCreate 中启动异步线程,加载需要被预加载的资源。


1)预创建 Tabview,预加载 Tab 数据,预解析 Tab 数据;


2)预加载类;


3)预加载关注 SDK;


4)预加载主 Fragment;


5)预加载 Delegate;


6)预加载以及预处理缓存以及快照。

七、其他优化

1)直接创建 Delegate,而非通过配置文件配置再反射创建; 2)整合 Delegate,减少向 EventBus 的注册次数; 3)减少字符串拼接操作。

八、快照

由于缓存数据处理是异步的,低端机进入发现后,等待缓存数据处理完成总得有个 Loading 界面,即使提前预加载缓存数据以及预处理好,低端机也不能避免 Loading,为了让用户不再看到过渡页面或者菊花,就得保证主线程能够带着数据渲染,而不是等数据好了后再更新界面。可惜的是,即使缓存反序列后,通过一顿猛如虎的操作:创建 Model、创建 Adapter、卡片布局优化,还是需要 200ms 的时间渲染 3 张卡片。最后,只能通过加载轻量级的缓存数据——快照来完成首屏的展示,加载缓存数据拢共分三步:


1)缓存数据的时候保存一份快照,只保留最简单的一些属性(低质量封图链接,PGC 信息);


2)预加载快照,预创建用于展示快照的容器 view(inflate 或者直接代码实现都可以);


3)进入发现后,优先展示快照,得缓存数据渲染完后,移出快照。


优化后的效果如下:


九、Push 冷启

借助自然冷启的优化成果以及 push 链路的特殊性——以视频起播为目标,特地针对 push


冷启做了以下优化:


1)预加载视频资源;


2)预初始化播放器;


3)去掉 Push 链路不需要的异步任务(缓存以及快照相关的逻辑);


4)调整 Push 链路,以视频起播为最高优先级,改造后的链路如下:


十、总结

启动优化主旨就一个:主线程只做 UI 操作。相伴的手段就是异步预加载,同步懒加载。另外也需要具体场景具体分析,大体步骤就是:通过工具导出启动 Trace 日志,分析整个启动路径的耗时因素,优先解决明显的耗时问题,后续再各个击破。一般情况下,在优化到可接受的目标后即可,而不需要优化到极致,因为性能的优化往往会带来额外的复杂度,比如以上提到的 Push 场景和正常的启动场景就不能复用相同的逻辑。


优化达到目标后需要守护住成果,在日常开发时需要严格守住 UI 线程的底线,上线后需要时常关注性能数据,这样攻防坚守才能持续交付高性能的成果。


作者 | 阿里文娱高级开发工程师 纸贵


2020-05-18 17:581419

评论

发布
暂无评论
发现更多内容

像用户一样测试:不妨犯傻

QualityFocus

软件测试 体验 可用性 用户体验

架构师训练营 1 期第 10 周:模块分解 - 作业

灵霄

极客大学架构师训练营

智慧警务平台搭建,大数据时代下的警务模式

t13823115967

大数据

即构低延迟直播产品L3,打造更优质的实时互动体验

ZEGO即构

架构师训练营第六周总结

Geek_xq

京东将上线社区团购“京喜拼拼”:社区团购是否是一次泡沫大战

石头IT视角

架构师训练营 1 期第 9 周:性能优化(三)

灵霄

极客大学架构师训练营

Devil Fruit恶魔果实APP系统软件开发

系统开发

智慧公安情报研判大数据系统分析平台搭建

t13823115967

智慧公安

网易有道 iOS二面经验分享

iOSer

ios 面试 网易

LeetCode题解:剑指 Offer 40. 最小的k个数,二叉堆,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

【Java并发编程】面试必备之线程池

java金融

线程池

架构师训练营 1 期第 12 周:数据应用(一) - 作业

灵霄

极客大学架构师训练营

简明设计模式—创建型

2970

设计模式 Go 语言

IDEA插件:多线程文件下载插件开发

Silently9527

Java 多线程 idea插件 文件传输

生产环境全链路压测建设历程 22:FAQ 1&2

数列科技杨德华

全链路压测 七日更

架构师训练营 1 期第 13 周:数据应用(二) - 作业

灵霄

极客大学架构师训练营

AI技术在音视频领域的发展

anyRTC开发者

人工智能 ios android AI WebRTC

架构师训练营 1 期第 11 周:安全稳定 - 作业

灵霄

极客大学架构师训练营

太平金科助力“开局之战”顺利启动,博睿数据“A+N”一体化解决方案全力护航

博睿数据

APM npm AIOPS

互联网寒冬下,程序员如何化解危机?答案全在这份阿里Java知识地图里

比伯

Java 编程 程序员 面试 计算机

面试官:我问的是Java内存模型,你回答堆栈方法区干嘛?

Java鱼仔

Java 程序员 JMM 多线程 并发

架构师训练营第五周”技术选型一“总结

随秋

极客大学架构师训练营

架构师训练营 1 期第 8 周:性能优化(二)- 作业

灵霄

极客大学架构师训练营

【Java并发编程】阿里最喜欢问的几道线程池的面试题?

java金融

Java 面试 线程池

也谈“中年焦虑”

程序员架构进阶

方法论 职业规划 中年危机

博睿数据支持腾讯云函数监控,Serverless时代已来临

博睿数据

Serverless APM 监控

一代版本一代神:利用Docker在Win10系统极速体验Django3.1真实异步(Async)任务

刘悦的技术博客

django python3.x 异步 异步任务

架构师训练营第六周作业

Geek_xq

咨询师的诱惑

escray

程序员 面试 面经

数字资产钱包系统开发及介绍

优酷Android发现页冷启优化_文化 & 方法_阿里巴巴文娱技术_InfoQ精选文章