应用有三种启动状态:冷启动、温启动或热启动。每种状态都会影响应用向用户显示所需的时间。在冷启动中,应用从头开始启动。在另外两种状态中,系统需要将后台运行的应用带入前台。
我们建议您始终在假定冷启动的基础上进行优化。这样做也可以提升温启动和热启动的性能。
如需优化应用以实现快速启动,了解系统和应用层面的情况以及它们在各个状态中的互动方式很有帮助。
确定应用启动时间的两个重要指标是初步显示所用时间 (TTID) 和完全绘制所用时间 (TTFD)。TTID 是显示第一帧所用的时间,TTFD 则是应用达到可全面互动的状态所用的时间。两者同样重要,因为 TTID 让用户知道应用正在加载,TTFD 则意味着用户等待多长时间才能实际使用应用。如果其中任一时间过长,用户都可能会在应用完全加载之前退出。
应用启动时间 | App quality | Android DevelopersAndroid 应用启动时间统计方式_android 启动时间统计-CSDN博客
可以使用 reportFullyDrawn() 方法测量从应用启动到完全显示所有资源和视图层次结构所用的时间。在应用执行延迟加载时,此数据会很有用。在延迟加载中,应用不会阻止窗口的初步绘制,但会异步加载资源并更新视图层次结构。
由于延迟加载,应用的初步显示不包括所有资源,您不妨将完全加载并显示所有资源及视图视为单独的指标。例如,您的界面可能已完全加载,并绘制了一些文本,但尚未显示应用必须从网络中提取的图片。
提高启动时间准确性说明了如何在您的应用达到可与用户进行互动的状态之前使用 FullyDrawnReporter 延迟调用 reportFullyDrawn。
当使用此 API 时,Logcat 显示的值为从创建应用对象到调用 reportFullyDrawn() 时所用的时间。以下是 Logcat 输出的示例:
system_process I/ActivityManager: Fully drawn {package}/.MainActivity: +1s54ms
Logcat 输出有时包含 total 时间。
使用新的系统跟踪工具:Perfetto
系统跟踪概览 | App quality | Android Developers
Perfetto 是 Android 10 中引入的平台级跟踪工具。这是适用于 Android、Linux 和 Chrome 的成熟开源跟踪项目。与 Systrace 不同,它提供数据源超集,可让您以协议缓冲区二进制流形式记录任意长度的跟踪记录。您可以在 Perfetto 界面中打开这些跟踪记录。
Systrace 是平台提供的旧版命令行工具,可记录短时间内的设备活动,并保存在压缩的文本文件中。该工具会生成一份报告,其中汇总了 Android 内核中的数据,例如 CPU 调度程序、磁盘活动和应用线程。Systrace 适用于 Android 4.3(API 级别 18)及更高版本的所有平台版本,但建议将 Perfetto 用于运行 Android 10 及更高版本的设备。
应用优化最佳实践 | App quality | Android Developers
结合使用基准配置文件和启动配置文件,以便全面优化应用启动。
Android应用的首次启动时间对于用户留存率来说非常重要。谷歌在Google IO 2022上向开发者推荐了基准配置文件(Baseline Profiles)方案来进行优化。这个方案的通用性极高,几乎所有Android应用都可以采用此方案进行优化。动辄 30%、40% 的启动优化成绩,还是一个通用的解决方案!而且 App 越复杂,提升明显!
另外此方案无Google Play也可使用,只要手机支持写入profile文件即可。但要注意混淆带来的影响。
Android 强推的 Baseline Profiles 国内能用吗?我找 Google 工程师求证了! - 掘金Android Baseline Profiles探究及实践 - 知乎
启动配置文件与基准配置文件类似。此类配置文件描述了对应用启动至关重要的类和方法,这些类和方法必须先做好加载准备。启动配置文件也使用与基准配置文件相同的人类可读格式 (HRF)。
注意:应用启动通常是多个关键 CUJ 的组合。对于简单的应用,您可以启动应用的 MainActivity。不过,您可能需要组合关键 CUJ,例如登录和其他重要的启动功能。
启动配置文件和基准配置文件之间的一个主要区别是,基准配置文件包含对应用启动以外的优化至关重要的类和方法,例如减少动画期间或应用启动以外的关键用户历程 (CUJ) 期间的卡顿。
启动配置文件和基准配置文件之间的另一个主要区别是,启动配置文件无法由库提供,也不受 Android Gradle 插件合并的约束。这是因为库不一定充分了解应用启动的关键类和方法有哪些。这些类和方法最好衍生自 Jetpack Macrobenchmark,并将 BaselineProfileRule 与专门针对应用启动的 CUJ(例如 collectStableBaselineProfile)结合使用。
具体操作:一起看 I/O | Android 性能相关最新动态 (qq.com)
这项优化能够改进启动期间所用代码的位置,缩短启动时间,从而减少应用启动期间发生的主要页面故障的数量。
为此,需要将启动期间要执行的所有代码添加到主要 classes.dex 文件中,同时将所有非启动代码从主要 classes.dex 文件中移除。
图 1. DEX 布局优化的代码位置改进。
基准配置文件和启动配置文件需要将Android打包脚本设为7.4以上:
如果不能升级打包工具版本,则参考:
在不使用 Macrobenchmark 的情况下创建和衡量基准配置文件 | App quality | Android Developers
类似的方案:
Android Dex分包最全总结:含Facebook解决方案-六虎
MutilDex 优化
ContentProvider 优化
启动任务重构与任务调度
Splash 与 Main 合并
反序列化优化
UI 渲染优化
主线程耗时消息优化
后台任务优化
GC 抑制
Android启动优化实践 - 知乎
抖音 Android 性能优化系列:启动优化实践 - 知乎