作者 / Google 和 Facebook 团队
撰稿 / Google Android 团队的 Kateryna Semenova 和 Facebook 团队的 Tim Trueman、Steven Harris、Subramanian Ramaswamy
简介
缩短应用的启动时间并非小事,我们必须深入了解其影响因素。今年,Google Android 团队和 Facebook 应用团队一直在合作研究这方面的量化指标,并共享优化方法,以改善应用启动情况。Google Android 的公开文档中包含了很多关于应用启动优化的信息。这里我们想进一步分享其在 Facebook 应用中的实践情况,以及哪些因素有助于改善应用启动性能。
现在,每个月有超过 29 亿人使用 Facebook。Facebook 帮助人们构建社区,并让世界更紧密地联系在一起。用户会在这里分享生活的瞬间,了解和讨论正在发生的事情,建立和培养人际关系,共同合作以创造收入机会。
从哪里开始
首先自然是测量应用的启动时间。您可借此获悉用户启动体验的健康程度,追踪启动时间恶化的情况,并计算进行改进需要投入的资源量。归根结底,您的启动时间需要与用户满意度、参与度或用户增长相关联,以确定投入的优先次序。
Android 定义了两个衡量应用启动时间的指标: 完全显示所用时间 (TTFD) 和初步显示所用时间 (TTID)。虽然您可以进一步将其划分为冷/暖启动时间,但本文不会解释它们之间的区别,而 Facebook 的方法是,衡量和优化与应用交互的所有用户所经历的启动时间 (有些是冷启动,有些是暖启动)。
不要改变太多: 有一件事需要注意,就是在 TTID 和 TTFD 之间应用内容的视觉变化问题,例如在页面里先展示的是已缓存的内容,然后在网络内容加载完成后突然切换页面内容。这种突然的变化可能会让用户感到不快和沮丧,所以请确保您的应用可在 TTID 期间显示足够有意义的内容,尽可能地向用户展示其将在 TTFD 期间看到的内容。
达成用户目标
用户访问您的应用是为了获取内容,这可能需要一段时间完成加载,而您希望应用可以尽快把这些内容呈现给他们。
Facebook 应用开发者专注于基于完全显示所用时间 (TTFD) 的指标,包含显示所有内容和图像,因为这代表了用户访问应用的完整体验。开发者想要知道,网络加载内容和图像是否花费了较长时间,或者加载失败,以便让团队可以从头到尾改善整个启动体验。
良好的 TTID 和 TTFD 目标应当是多少?
Facebook 将启动时间指标设定为他们认为应用启动耗时 "不佳" 的百分比,即任何 TTFD 超过 2.5 秒的启动或启动失败的部分 (例如,图像无法加载或应用崩溃)。Facebook 致力于通过改进时间超过 2.5 秒的启动,使其摆脱 "不佳" 状态,以及修复导致启动失败的问题,从而降低启动时间 "不佳" 的比例。选择 2.5 秒是因为,研究表明,这对于 Facebook 用户来说很重要。这也与 Web Vitals 为网站建议的最大内容绘制 (LCP) 指标相符。
与 TTID 相比,提供完整体验,尤其是用网络获取最近的内容,会让您的 TTFD 启动指标看起来相当缓慢。而这其实是一件好事!它反映了用户对您应用的真实体验。您对此所做的改进,可能会像 Facebook 那样,提高用户的应用使用率以及对其性能的认可。
测量 TTFD 的棘手程度可能会视您的应用而异。如果太难,不妨从初步显示所用时间 (TTID) 着手。虽然由于占位块或图像的存在可能会导致无法量化部分内容的加载性能,但这依然是一个着手点,毕竟这部分也是用户日常与应用交互的内容 (虽然不是全部)。
检测 TTID
在 Android 4.4 (API 级别 19) 及更高版本中,logcat 提供了 "Displayed" 值,用于记录从启动进程到完成在屏幕上绘制相应 Activity 第一帧所经过的时间。
报告的日志行类似于以下示例:
ActivityManager: Displayed com.android.myexample/.StartupTiming: +3s534ms
检测 TTFD
要检测 TTFD,只需在您的所有内容都在屏幕上显示后,在 Activity 中调用 reportFullyDrawn()。请确保包含替换占位符的任何内容,以及您渲染的任何图像 (务必计算图像本身显示的时间,而不仅是其占位符显示的时间)。在您调用 reportFullyDrawn() 后,就可以在 logcat 里看到它:
ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms
来自 Facebook 应用开发者的建议
Jetpack App Startup 开发库
https://developer.android.google.cn/topic/libraries/app-startup
Web Vitals
https://web.dev/learn-web-vitals/
累积布局偏移
https://web.dev/cls/
动画
https://facebook.github.io/shimmer-android/
系统跟踪
https://developer.android.google.cn/topic/performance/tracing
Google Android 团队给出的建议
Google Android 团队关于衡量和优化应用启动的建议请查阅官方文档 "应用启动时间":
https://developer.android.google.cn/distribute/best-practices/develop/android-vitals
reportFullyDrawn()
https://developer.android.google.cn/reference/android/app/Activity?#reportFullyDrawn()
https://support.google.com/googleplay/android-developer/answer/9844486#zippy=%2Capp-start-up-time
https://developer.android.google.cn/studio/profile/macrobenchmark#startup
https://developer.android.google.cn/topic/performance/tracing
密集型应用初始化
https://developer.android.google.cn/topic/performance/vitals/launch-time?#heavy-app
总结
本文介绍了一些关键的启动时间指标和优化最佳实践,以改善启动体验,帮助提升 Facebook Android 应用的用户参与度和使用率。本文还分享了 Google Android 团队建议的指标、开发库和工具。任何 Android 应用都可从本文分享的策略中受益。请大家动起手来,认真量化应用的启动情况,并为用户打造快速且令人愉悦的应用启动体验!
欢迎您通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!
推荐阅读
点击屏末 | 阅读原文 | 进一步了解 Android 开发信息