写点什么

优酷 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:581416

评论

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

多款国产操作系统安装数据库干货文档汇总(含Oracle/MySQL/国产数据库等)

墨天轮

MySQL 数据库 oracle 国产操作系统 麒麟软件

Microsoft Remote Desktop for Mac 10.9.4中文版

iMac小白

microsoft remote desktop

1024程序员节|是时候,展示真正的实力了!

Openlab_cosmoplat

1024 1024程序员节

协同发展,生态聚合丨1024程序员节暨「源聚一堂」开源技术沙龙(北京站)成功举办

开放原子开源基金会

Op丨ARB链dapp代币合约质押项目系统开发

l8l259l3365

HarmonyOS多音频播放并发政策及音频管理解析

HarmonyOS开发者

HarmonyOS

【有奖体验】AIGC小说创作大赛开启!通义千问X函数计算部署AI助手

Serverless Devs

阿里云 Serverless AI

如何确定Apache Kafka的大小和规模

互联网工科生

kafka

关于数据库分片你需要知道的

遥遥知识库

Java 分布式数据库 后端 数据库分片 关于XX你应该知道的

EndNote 21 for mac破解版 EndNote 21激活安装

iMac小白

EndNote 21下载 EndNote 21破解版 EndNote 21 mac

苹果Mac电脑思维导图软件XMind for mac中文破解版

iMac小白

XMind下载 XMind2023 XMind破解版 XMind中文版 XMind Pro

焕新升级!新一代云原生可观测平台

华为云原生团队

云计算 容器 云原生 边缘计算

运维:MySQL常用的服务器状态命令

这我可不懂

MySQL 数据库

如何区分特权账号管理系统PAM和堡垒机

尚思卓越

网络安全 堡垒机 特权账号管理

特权账号管理系统简述

尚思卓越

特权账号管理 特权账号 PAM

低代码让软件开发更快捷、简单

高端章鱼哥

低代码

最好的私有云桌面解决方案

青椒云云电脑

云桌面

Meetup 回顾|Data Infra 研究社第十六期(含资料发布)

Databend

Chat Towards Data Science|如何用个人数据知识库构建 RAG 聊天机器人?

Zilliz

chatbot Zilliz zillizcloud rag

低代码助力软件开发

互联网工科生

软件开发 低代码

如何为3D模型设置自发光材质?

3D建模设计

材质 纹理 贴图

幸福里基于 Flink & Paimon 的流式数仓实践

字节跳动云原生计算

flink paimon

特权账号的功能

尚思卓越

网络安全 堡垒机 特权账号

产品经理的效率利器:揭秘提升工作效率的10大神器!

彭宏豪95

项目管理 产品经理 在线白板 办公软件 在线协作

设计一套评论系统

Kevin_913

Java 数据库设计 评论系统

第11期 | GPTSecurity周报

云起无垠

灵活、可用、高扩展,EasyMR 带来全新 Yarn 的队列管理功能及可视化配置

袋鼠云数栈

hadoop YARN CDH 资源调度 hdp

挑战吧,HarmonyOS应用开发工程师

HarmonyOS开发者

HarmonyOS

Acrobat Pro DC 2023中文直装版 专业PDF编辑

iMac小白

Acrobat Pro DC 2023 Adobe Acrobat Pro DC下载 Adobe Acrobat Pro DC破解

揭示Lombok的代码设计缺陷:探索封装问题

树上有只程序猿

lombok Java 开发

如何使用透明贴图实现火焰效果

3D建模设计

材质 纹理 贴图

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