首先,需要理解 Android 应用的三种启动类型:
Activity
实例已被销毁。系统需要重新创建 Activity
并加载其视图。Activity
实例和视图都保留在内存中,耗时最短。在冷启动过程中,我们需要重点关注以下几个时间节点的耗时:
Application.onCreate()
Activity.onCreate()
到 Activity.onResume()
Activity
的创建、主题和布局的加载(setContentView()
)、数据的请求与渲染等。onWindowFocusChanged()
Activity
的 onWindowFocusChanged()
被调用的时间,作为“用户可用”的启动时间。精确的测量是优化的前提。
Perfetto
/ Systrace
Android Studio Profiler
命令行 adb
adb shell am start -W [packageName]/[fullActivityName]
,关注输出结果中的 TotalTime
。App Startup
库来管理初始化顺序和线程。setContentView()
是启动过程中的一个主要耗时点。
ConstraintLayout
创建扁平化的复杂布局,避免深层嵌套。<merge>
:在可复用的自定义布局中,使用 <merge>
标签来减少一个视图层级。<ViewStub>
:对于那些只在特定情况下才显示的 UI 元素(如加载失败提示、引导蒙层),使用 <ViewStub>
。它是一个轻量级的、不占内存的视图,只在被显式 inflate()
时才会加载其真实布局。Baseline Profiles
是一个包含了启动和关键交互过程中的类和方法列表的文本文件。Baseline Profiles
,特别是对于使用 Jetpack Compose 的应用,效果尤为显著。Activity
加载完成前,通过设置一个预览主题(windowBackground
),可以避免用户看到白屏或黑屏,提升感知体验。