HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

评论

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

写一个Chrome浏览器插件

京东科技开发者

用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成

阿里云云效

阿里云 云原生

官方带队实测,阶梯式解锁飞桨框架3.0能力新特性,轻松上手!

飞桨PaddlePaddle

百度 飞桨AI

并发编程/Actor模型设计为高并发项目提供基础模型(设计篇)

肖哥弹架构

Java 并发编程 高并发

鲲鹏原生赋能浩瀚深度,网络数据可视化处理更加高效

Geek_2d6073

多分支组网解决方案:SD-WAN

Ogcloud

SD-WAN 企业组网 SD-WAN组网 SD-WAN服务商 SDWAN

如何使用Python开发1688商品详情API接口?

科普小能手

API 1688 Python开发 API 接口 1688商品详情接口

JNPF低代码开发平台赋能数智化转型探索及趋势分析

快乐非自愿限量之名

低代码

DeFi 市场收益疲软?Astherus 或成用户捕获收益的最佳管道

股市老人

想管理好团队?一定要三“靠”三“不靠”

敏捷开发

管理 团队建设 企业管理 团队协同

浅谈DNS递归解析和迭代解析之间的区别

国科云

域名解析 DNS解析

揭秘,实时比赛统计模块如何集成开发到体育直播平台

软件开发-梦幻运营部

精准测试如何落地

霍格沃兹测试开发学社

Node Exporter 可观测性最佳实践

观测云

Node Exporter

Java实现随机抽奖的方法有哪些

不在线第一只蜗牛

Java Python

Gemini 发布 iOS app,Live 语音聊天免费用;微信公众号上线 AI 音色克隆功能丨 RTE 开发者日报

声网

wifi7 IPQ5322 and QCN9274/QCN6274 Chip Solutions Detailed Overview and Application Prospects

wifi6-yiyi

WiFi7 wap3

如何做好客户管理?主要内容介绍

爱吃小舅的鱼

客户管理

从校招生到项目经理,菜鸟如何开展项目管理

京东科技开发者

访问海外网站的网络工具: SD-WAN海外专线

Ogcloud

SD-WAN SD-WAN组网 SD-WAN国际专线 海外网络专线 跨国网络专线

华为之泉,涌入开源事业的大江大河

脑极体

AI 软件

火山引擎与东风Honda,为用户创造了个驾乘“搭子”

新消费日报

用通义灵码,从 0 开始打造一个完整APP,无需编程经验就可以完成

阿里巴巴云原生

阿里云 云原生

Spring Cloud Ribbon 实现“负载均衡”的详细配置说明

快乐非自愿限量之名

Spring Boot

淘宝/天猫商品详情API返回值深度剖析与实战运用:聚焦taobao.item_get_desc

代码忍者

API 接口 pinduoduo API

税友:基于鲲鹏原生开发税务行业应用,引领智慧税务

Geek_2d6073

实操案例|TinyVue树表+动态行合并

OpenTiny社区

开源 前端 组件库 OpenTiny TinyVue

Go协程池开源库及示例用法

baiyutang

Go golang 编程 云原生

鸿蒙开发Hvigor任务简介

龙儿筝

如何评估迷因币的成功潜力?

区块链软件开发推广运营

交易所开发 链游开发 公链开发 链游开发dapp开发 NFFT开发

一键自动生成ppt的AI工具!这5款不容错过!

职场工具箱

人工智能 PPT 办公软件 AIGC AI生成PPT

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