启动的分类(热身环节)
启动动类型 | 触发条件 | 系统开销 & 速度 | 主要优化方向 |
---|---|---|---|
冷启动 | 应用进程不存在(首次启动或进程被杀后启动) | 最高,需创建进程、加载资源、初始化所有组件 | 主要优化目标,减少主线程任务,延迟初始化 |
热启动 | 应用进程仍在后台(从后台唤起或切换回来) | 最低,只需将已有Activity切到前台 | 保持进程存活,但需避免因后台存活耗电或被杀 |
温启动 | 进程可能存在,但Activity需重建(如Back退出后又启动或系统回收内存后) | 中等,可能需重建Activity | 优化Activity重建速度,利用Saved Instance State |
🔍 理解冷启动
应用冷启动时,系统需要创建新进程,并完成从Application初始化到首屏Activity渲染的完整过程。这个过程通常会给用户呈现一个空白窗口(或主题指定的预览窗口),直到首屏完成绘制。
冷启动的完整流程可以概括为以下几个关键阶段:
-
系统准备进程:Launcher通过Binder IPC通知system_server进程,system_server再请求Zygotefork出新应用进程。
-
应用进程初始化:
-
执行
Application
的attachBaseContext()
和onCreate()
方法。 -
启动主线程(UI线程)。
-
创建并初始化主Activity。
-
-
创建和渲染视图:主Activity执行
onCreate()
(加载布局)、onStart()
、onResume()
,接着进行测量(measure)、布局(layout)、绘制(draw),最终内容被呈现到屏幕,替换之前的预览窗口。
🐢 常见瓶颈与优化建议
冷启动耗时通常消耗在以下方面(安卓为例子):
-
主线程繁重的初始化工作:在
Application
或首屏Activity
的onCreate
中同步执行大量耗时的第三方库初始化、网络请求、密集I/O操作(如读写数据库或SharedPreferences)、复杂计算等,会阻塞UI渲染。 -
复杂的布局和视图层次:首屏XML布局过于复杂,嵌套层次太深,或使用了耗时操作的自定义View,会导致
inflate
、measure
、layout
阶段非常缓慢8。 -
过多的Class加载和对象初始化:加载大量类(特别是第三方库的类)、创建大量临时对象,会增加CPU压力并可能触发GC,导致卡顿。
优化思路主要是转移、减少和推迟:
-
异步初始化与懒加载:
-
将非必需立即使用的组件(如某些第三方SDK、缓存预加载)放到后台线程初始化(如使用
IntentService
或WorkManager
)。 -
对于一些组件,将其初始化推迟到真正需要使用的时候。
-
注意线程竞争,避免“伪异步”。
-
-
优化首屏布局和渲染:
-
简化布局结构,减少不必要的嵌套和视图数量,考虑使用
ConstraintLayout
。 -
避免在UI线程进行耗时的测量和绘制操作。
-
-
关注
Application
的创建过程:-
优化
Application
中的逻辑,只保留最必需的初始化。 -
控制方法数,避免过多的Dex文件,这会增加加载时间。
-
-
利用主题预览窗减少白屏感:通过为启动Activity设置特殊的主题,其中
android:windowBackground
设置为一张图片或特定颜色的drawable,在页面真正渲染完成前显示,给用户一种“应用已经启动”的快速感觉,提升感知体验
鸿蒙中
开发应用或元服务过程中,启动速度是很重要的一个指标。如果开发者需要分析启动过程的耗时瓶颈,优化应用或元服务的冷启动速度,可使用DevEco Profiler提供的Launch场景分析能力,录制启动过程中的关键数据进行分析,从而识别出导致启动缓慢的原因所在。此外,Launch任务窗口还集成了Time、CPU、Frame、Network场景分析任务的功能,方便开发者在分析启动耗时的过程中同步对比同一时段的其他资源占用情况
启动模式
启动模式分为自动启动和手动启动,可点击图标切换两种不同模式:
- 若选择自动启动模式,当用户使用Launch模板并开始录制时,将主动重启所选应用;
- 手动启动模式在开始录制时,只会主动终止所选应用,等待界面出现弹窗提示启动应用后,开发者需要手动启动应用。
查看启动过程中各阶段的耗时情况
1:创建Launch场景调优分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
说明
Launch分析任务支持在录制前单击,指定要录制的泳道。“Launch”泳道显示启动生命周期各阶段的耗时分布情况
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“Ctrl+, ”向前选中单点时间标签,通过“Ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“Ctrl+[ ”向前选中时间段时间标签,通过“Ctrl+]”向后选中时间段时间标签。
- Launch分析支持离线符号解析能力,请参见离线符号解析。
- Launch分析支持动效场景调优,请参见支持动效场景调优。
2:单击“Launch”泳道上的单个阶段,或框选多个阶段,在下方的“Details”页签中,可查看到所选阶段的耗时统计情况。展开各阶段的统计信息折叠表,可以看到各个任务的具体耗时信息。单击跳转按钮,可直接跳转至相关线程打点任务中。
3:切换到“Load ETS Files”页签,从DevEco Studio 6.0.0 Beta1版本开始,支持查看冷启动过程中ETS文件的加载情况。各字段含义如下:
- Category:该ETS文件在应用启动过程中是否被使用。
- Weight:该ETS文件加载子节点文件(不包括自身)的总耗时。
- Self:该ETS文件自身加载的耗时。
- Import Count:该ETS文件被其他文件导入的次数。
- File Name:该ETS文件的名称。
- Path:该ETS文件构建产物的路径。
4:切换到“TOP Redundant”页签,可查看冷启动过程中TOP 100冗余ETS加载文件信息。若File Name字段显示为蓝色,双击可快速跳转至对应工程源文件
分析静态资源库加载耗时
-
展开“Launch”泳道,其中的“Static Initialization”子泳道展示启动过程中各静态资源库的加载耗时。
-
单击单个静态资源库色块,或框选多个静态资源库,下方的“Details”区域展示所选对象的耗时统计信息。
针对耗时超过预期的加载任务,可单击跳转按钮,跳转至相关线程打点任务中进行深度分析。
查看核心线程在CPU Core的运行情况
- 展开“Launch”泳道,其中的“Running CPU Cores”子泳道展示启动过程中的关键线程具体运行在哪个CPU核心。
- 单击单个进程色块,或框选多个进程,下方的“Details”区域展示所选对象的运行情况统计信息。
单击对应CPU的跳转按钮,可进一步跳转到CPU Core泳道查看详细的调度信息。
指南优化应用性能冷启动分析:Launch分析Launch模板基本操作
Launch模板基本操作
开发应用或元服务过程中,启动速度是很重要的一个指标。如果开发者需要分析启动过程的耗时瓶颈,优化应用或元服务的冷启动速度,可使用DevEco Profiler提供的Launch场景分析能力,录制启动过程中的关键数据进行分析,从而识别出导致启动缓慢的原因所在。此外,Launch任务窗口还集成了Time、CPU、Frame、Network场景分析任务的功能,方便开发者在分析启动耗时的过程中同步对比同一时段的其他资源占用情况。
此处仅介绍“Launch”泳道相关内容,集成的Time、CPU、Frame、Network场景分析任务的功能请参考对应任务的章节。
说明
- 不支持命令拉起的Release应用不能进行Launch分析。
- 锁屏状态下可进行Launch录制。
启动模式
启动模式分为
自动启动和手动启动,可点击图标切换两种不同模式:
- 若选择自动启动模式,当用户使用Launch模板并开始录制时,将主动重启所选应用;
- 手动启动模式在开始录制时,只会主动终止所选应用,等待界面出现弹窗提示启动应用后,开发者需要手动启动应用。
查看启动过程中各阶段的耗时情况
- 创建Launch场景调优分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。
说明
- 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
- 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
- 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
- 在任务分析窗口,可以通过“Ctrl+, ”向前选中单点时间标签,通过“Ctrl+. ”向后选中单点时间标签。
- 在任务分析窗口,可以通过“Ctrl+[ ”向前选中时间段时间标签,通过“Ctrl+]”向后选中时间段时间标签。
- Launch分析支持离线符号解析能力,请参见离线符号解析。
- Launch分析支持动效场景调优,请参见支持动效场景调优。
Launch分析任务支持在录制前单击
指定要录制的泳道。“Launch”泳道显示启动生命周期各阶段的耗时分布情况。
- 单击“Launch”泳道上的单个阶段,或框选多个阶段,在下方的“Details”页签中,可查看到所选阶段的耗时统计情况。
展开各阶段的统计信息折叠表,可以看到各个任务的具体耗时信息。单击跳转按钮,可直接跳转至相关线程打点任务中。
- 切换到“Load ETS Files”页签,从DevEco Studio 6.0.0 Beta1版本开始,支持查看冷启动过程中ETS文件的加载情况。各字段含义如下:
- Category:该ETS文件在应用启动过程中是否被使用。
- Weight:该ETS文件加载子节点文件(不包括自身)的总耗时。
- Self:该ETS文件自身加载的耗时。
- Import Count:该ETS文件被其他文件导入的次数。
- File Name:该ETS文件的名称。
- Path:该ETS文件构建产物的路径。
- 切换到“TOP Redundant”页签,可查看冷启动过程中TOP 100冗余ETS加载文件信息。若File Name字段显示为蓝色,双击可快速跳转至对应工程源文件。
说明
已上架应用市场的应用,不支持使用Load ETS Files或TOP Redundant页签查看冷启动过程中ETS文件的加载情况。
分析静态资源库加载耗时
- 展开“Launch”泳道,其中的“Static Initialization”子泳道展示启动过程中各静态资源库的加载耗时。
- 单击单个静态资源库色块,或框选多个静态资源库,下方的“Details”区域展示所选对象的耗时统计信息。
针对耗时超过预期的加载任务,可单击跳转按钮,跳转至相关线程打点任务中进行深度分析。
查看核心线程在CPU Core的运行情况
- 展开“Launch”泳道,其中的“Running CPU Cores”子泳道展示启动过程中的关键线程具体运行在哪个CPU核心。
- 单击单个进程色块,或框选多个进程,下方的“Details”区域展示所选对象的运行情况统计信息。
单击对应CPU的跳转按钮,可进一步跳转到CPU Core泳道查看详细的调度信息。
查看启动过程相关的线程Trace数据
- 展开“Launch”泳道,除“Static Initialization”、“Running CPU Cores”外,还包含启动过程的关键线程的状态和Trace数据。
- 单击单个切片色块,或框选多个切片,可查看所选对象的详情。
- “Details”区域对所选对象进行树状统计,显示任务的名称、起始时间以及耗时信息。
- “Thread States”区域展示线程的状态统计信息。
- “Thread Usage”区域展示线程的使用情况。
- “Slice List”区域展示所选对象的切片统计信息。
- “Load Statistics”区域展示所选对象的中载重载信息。