鸿蒙中冷启动分析:Launch分析

启动的分类(热身环节)

启动动类型触发条件系统开销 & 速度主要优化方向
冷启动应用进程不存在(首次启动或进程被杀后启动)最高,需创建进程、加载资源、初始化所有组件主要优化目标,减少主线程任务,延迟初始化
热启动应用进程仍在后台(从后台唤起或切换回来)最低,只需将已有Activity切到前台保持进程存活,但需避免因后台存活耗电或被杀
温启动进程可能存在,但Activity需重建(如Back退出后又启动或系统回收内存后)中等,可能需重建Activity优化Activity重建速度,利用Saved Instance State

🔍 理解冷启动

应用冷启动时,系统需要创建新进程,并完成从Application初始化到首屏Activity渲染的完整过程。这个过程通常会给用户呈现一个空白窗口(或主题指定的预览窗口),直到首屏完成绘制。

冷启动的完整流程可以概括为以下几个关键阶段:

  1. 系统准备进程:Launcher通过Binder IPC通知system_server进程,system_server再请求Zygotefork出新应用进程

  2. 应用进程初始化

    • 执行ApplicationattachBaseContext()onCreate()方法。

    • 启动主线程(UI线程)

    • 创建并初始化主Activity

  3. 创建和渲染视图:主Activity执行onCreate()加载布局)、onStart()onResume(),接着进行测量(measure)、布局(layout)、绘制(draw),最终内容被呈现到屏幕,替换之前的预览窗口。

🐢 常见瓶颈与优化建议

冷启动耗时通常消耗在以下方面(安卓为例子):

  • 主线程繁重的初始化工作:在Application或首屏ActivityonCreate同步执行大量耗时的第三方库初始化、网络请求、密集I/O操作(如读写数据库或SharedPreferences)、复杂计算等,会阻塞UI渲染。

  • 复杂的布局和视图层次:首屏XML布局过于复杂,嵌套层次太深,或使用了耗时操作的自定义View,会导致inflatemeasurelayout阶段非常缓慢8。

  • 过多的Class加载和对象初始化:加载大量类(特别是第三方库的类)、创建大量临时对象,会增加CPU压力并可能触发GC,导致卡顿。

优化思路主要是转移、减少和推迟

  • 异步初始化与懒加载

    • 非必需立即使用的组件(如某些第三方SDK、缓存预加载)放到后台线程初始化(如使用IntentServiceWorkManager)。

    • 对于一些组件,将其初始化推迟到真正需要使用的时候。

    • 注意线程竞争,避免“伪异步”。

  • 优化首屏布局和渲染

    • 简化布局结构,减少不必要的嵌套和视图数量,考虑使用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字段显示为蓝色,双击可快速跳转至对应工程源文件

分析静态资源库加载耗时

  1. 展开“Launch”泳道,其中的“Static Initialization”子泳道展示启动过程中各静态资源库的加载耗时。
  2. 单击单个静态资源库色块,或框选多个静态资源库,下方的“Details”区域展示所选对象的耗时统计信息。

    针对耗时超过预期的加载任务,可单击跳转按钮,跳转至相关线程打点任务中进行深度分析。

查看核心线程在CPU Core的运行情况

  1. 展开“Launch”泳道,其中的“Running CPU Cores”子泳道展示启动过程中的关键线程具体运行在哪个CPU核心。
  2. 单击单个进程色块,或框选多个进程,下方的“Details”区域展示所选对象的运行情况统计信息。

    单击对应CPU的跳转按钮,可进一步跳转到CPU Core泳道查看详细的调度信息。

指南优化应用性能冷启动分析:Launch分析Launch模板基本操作

Launch模板基本操作

开发应用或元服务过程中,启动速度是很重要的一个指标。如果开发者需要分析启动过程的耗时瓶颈,优化应用或元服务的冷启动速度,可使用DevEco Profiler提供的Launch场景分析能力,录制启动过程中的关键数据进行分析,从而识别出导致启动缓慢的原因所在。此外,Launch任务窗口还集成了Time、CPU、Frame、Network场景分析任务的功能,方便开发者在分析启动耗时的过程中同步对比同一时段的其他资源占用情况。

此处仅介绍“Launch”泳道相关内容,集成的Time、CPU、Frame、Network场景分析任务的功能请参考对应任务的章节。

说明

  • 不支持命令拉起的Release应用不能进行Launch分析。
  • 锁屏状态下可进行Launch录制。

启动模式

启动模式分为

自动启动和手动启动,可点击图标切换两种不同模式:

  • 若选择自动启动模式,当用户使用Launch模板并开始录制时,将主动重启所选应用;
  • 手动启动模式在开始录制时,只会主动终止所选应用,等待界面出现弹窗提示启动应用后,开发者需要手动启动应用。

查看启动过程中各阶段的耗时情况

  1. 创建Launch场景调优分析任务并录制相关数据,操作方法可参考性能问题定位:深度录制,或在会话区选择Open File,导入历史数据。

    说明

    • 在任务分析窗口,可以通过“Ctrl+鼠标滚轮”缩放时间轴,通过“Shift+鼠标滚轮”左右移动时间轴。或使用快捷键W/S放大或缩小时间轴,使用A键/D键可以左右移动时间轴。
    • 将鼠标悬停在泳道任意位置,可以通过M键添加单点时间标签。
    • 鼠标框选要关注的时间段,可以通过“Shift+M”添加时间段时间标签。
    • 在任务分析窗口,可以通过“Ctrl+, ”向前选中单点时间标签,通过“Ctrl+. ”向后选中单点时间标签。
    • 在任务分析窗口,可以通过“Ctrl+[ ”向前选中时间段时间标签,通过“Ctrl+]”向后选中时间段时间标签。
    • Launch分析支持离线符号解析能力,请参见离线符号解析。
    • Launch分析支持动效场景调优,请参见支持动效场景调优。

    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字段显示为蓝色,双击可快速跳转至对应工程源文件。

说明

已上架应用市场的应用,不支持使用Load ETS Files或TOP Redundant页签查看冷启动过程中ETS文件的加载情况。

分析静态资源库加载耗时

  1. 展开“Launch”泳道,其中的“Static Initialization”子泳道展示启动过程中各静态资源库的加载耗时。
  2. 单击单个静态资源库色块,或框选多个静态资源库,下方的“Details”区域展示所选对象的耗时统计信息。

    针对耗时超过预期的加载任务,可单击跳转按钮,跳转至相关线程打点任务中进行深度分析。

查看核心线程在CPU Core的运行情况

  1. 展开“Launch”泳道,其中的“Running CPU Cores”子泳道展示启动过程中的关键线程具体运行在哪个CPU核心。
  2. 单击单个进程色块,或框选多个进程,下方的“Details”区域展示所选对象的运行情况统计信息。

    单击对应CPU的跳转按钮,可进一步跳转到CPU Core泳道查看详细的调度信息。

查看启动过程相关的线程Trace数据

  1. 展开“Launch”泳道,除“Static Initialization”、“Running CPU Cores”外,还包含启动过程的关键线程的状态和Trace数据。
  2. 单击单个切片色块,或框选多个切片,可查看所选对象的详情。

    • “Details”区域对所选对象进行树状统计,显示任务的名称、起始时间以及耗时信息。
    • “Thread States”区域展示线程的状态统计信息。
    • “Thread Usage”区域展示线程的使用情况。
    • “Slice List”区域展示所选对象的切片统计信息。
    • “Load Statistics”区域展示所选对象的中载重载信息。

官网链接  官方学习班级

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/94307.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/94307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

告别盲目排查,PolarDB+DAS Agent智能运维新突破

1.概述 周五下午6点正准备下班,数据库CPU突然爆满,业务告警响成一片,DBA却要手动翻查CPU/内存/负载等多个监控指标,还要查询是否有新增慢SQL,死锁等问题?” 这可能是数据库DBA最闹心的场景了,…

Linux------《零基础到联网:CentOS 7 在 VMware Workstation 中的全流程安装与 NAT 网络配置实战》

(一)Linux的发行版Centos安装与配置 下载Linux发行版本Centos:centos-7-isos-x86_64安装包下载_开源镜像站-阿里云点击CentOS-7-x86_64-DVD-2009.torrent ,CentOS-7-x86_64-DVD-2009.torrent是官方提供的 BT 种子文件(176.1 KB&a…

iOS App 混淆工具实战,教育培训类 App 的安全保护方案

随着在线教育、企业培训、知识付费平台的兴起,越来越多的 iOS 应用需要保护自己的课程资源和核心逻辑。然而,教育类 App 面临的最大风险并非传统的外挂或刷分,而是 视频盗链、题库数据泄露、源码逻辑被二次利用。 在这种场景下,合…

RabbitMQ:SpringAMQP Topic Exchange(主题交换机)

目录一、案例需求二、基础配置三、代码实现TopicExchange与DirectExchange类似,区别在于RoutingKey可以是多个单次的列表,并且以.分割。 Queue与Exchange指定BindingKey时可以使用通配符: #:代指0个或多个单词。*:代…

(纯新手教学)计算机视觉(opencv)实战六——图像形态学(腐蚀、膨胀、开运算、闭运算、梯度、顶帽、黑帽)

图像形态学在图像处理中,形态学(Morphology) 是一种基于图像中物体形状的处理方法,通常用于二值图像和灰度图像。它通过腐蚀、膨胀等基本操作,结合开运算、闭运算、梯度运算、顶帽、黑帽等派生操作,来实现去…

学习嵌入式第三十五天

文章目录网络(续上)1.函数接口2.相关功能实现1.TCP连接2.UDP习题网络(续上) 1.函数接口 sendto 原型:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, sockle…

为什么给数据表加了索引,写入速度反而变慢了

为数据表增加索引后之所以会导致写入(包括插入、更新、删除)操作的速度变慢,其根本原因在于索引本质上是一个独立的、需要与主表数据保持实时同步的“数据结构”。这一机制的核心逻辑涵盖五个方面:因为索引本质上是一个“独立的数…

.NET Core 中采用独立数据库的SAAS(多租户)方法

介绍多租户是指一种软件架构,其中软件的单个实例在服务器上运行并为多个租户提供服务。在基于 SAAS 的平台中,租户是指使用该平台开展业务运营的客户。每个租户都拥有独立的数据、用户帐户和配置设置,并且与其他租户隔离。多租户允许有效利用…

运维日常工作100条

这是一份非常详细和实用的“运维日常工作100条”清单。它涵盖了从日常巡检、变更管理、故障处理到安全、优化和文档等运维工作的方方面面,可以作为运维工程师的日常工作指南和检查清单。 运维日常工作100条 一、日常巡检与监控 (20条) 检查核心监控大盘:查看整体业务健康状态…

OpenHarmony子系统介绍

OpenHarmony子系统OpenHarmony子系统1. AI业务子系统2. 方舟运行时子系统3. ArkUI框架子系统4. DFX子系统5. DeviceProfile子系统6. XTS子系统7. 上传下载子系统8. 主题框架子系统9. 事件通知子系统10. 位置服务子系统11. 元能力子系统12. 全局资源调度子系统13. 全球化子系统1…

博士招生 | 英国谢菲尔德大学 招收计算机博士

内容源自“图灵学术博研社”gongzhonghao学校简介谢菲尔德大学(The University of Sheffield)是英国久负盛名的公立研究型大学,也是罗素集团成员之一。在 2026 年 QS 世界大学排名中,谢菲尔德大学位列第92位,其中计算机…

如何理解面向过程和面向对象,举例说明一下?

面向过程和面向对象是两种不同的编程思想,核心区别在于解决问题的视角不同:前者关注 “步骤和过程”,后者关注 “对象和交互”。面向过程的核心思想是把问题拆解成一系列步骤,通过函数实现每个步骤,然后按顺序调用这些…

深入了解评估与微调中使用的Graders:原理、实现与最佳实践

深入了解评估与微调中使用的Graders 在模型评估与微调(Fine-tuning)过程中,Graders(评分器)是衡量模型输出与参考答案之间表现的重要工具。本文将系统介绍Grader的类型、技术实现及如何在实际项目中融入稳定且高质量的…

行缓存(line buffer)在图像卷积中的工作方式

上面这张图配合文字,展示了行缓存(line buffer)在图像卷积中的工作方式:上半部分是一个按行扫描输入的图像块(示例为 99,编号 1–81)。 蓝色表示已被写入行缓存并按队列等待的数据,绿…

【数据分享】中国371个城市的坡度矢量数据和excel数据

今天要说明数据就是中国371个城市的坡度矢量数据和excel数据。数据介绍在城市发展的进程中,地形地貌始终是影响规划决策的关键因素,而坡度作为表征地表倾斜程度的核心指标,更是贯穿于城市建设、生态保护等诸多环节。本文将全面解读中国 371 个…

《WINDOWS 环境下32位汇编语言程序设计》第7章 图形操作(1)

图形设备接口GDI(Graphics Device Interface)是Win32的一个重要组成部分,其作用是允许Windows的应用程序将图形输出到计算机屏幕、打印机或其他输出设备上。GDI实际上是一个函数库,包括直线、画图和字体处理等数百个函数。7.1 GDI…

数据结构-HashMap

在 Java 键值对(Key-Value)集合中,HashMap 是使用频率最高的实现类之一,凭借高效的查找、插入性能,成为日常开发的 “利器”。本文将从 HashMap 的底层原理、核心特点、常用方法到遍历方式、使用注意事项,进…

[系统架构设计师]安全架构设计理论与实践(十八)

[系统架构设计师]安全架构设计理论与实践(十八) 一.信息安全面临的威胁 1.信息系统安全威胁的来源 物理环境,通信链路,网络系统,操作系统,应用系统,管理系统 2.网络与信息安全风险类别 风险类别…

AI适老服务暖人心:AI适老机顶盒破数字鸿沟、毫米波雷达护独居安全,银发生活新保障

银发经济领域长期受限于 “专业照护资源稀缺”“老年人数字适应能力弱”“独居老人安全隐患多” 的困境,而 AI 技术的适老化改造,正让银发服务从 “被动保障” 转向 “主动关怀”,既能帮老年人跨越数字鸿沟,又能为独居老人筑起安全…

Linux应用软件编程---网络编程1(目的、网络协议、网络配置、UDP编程流程)

Linux下的网络编程一、目的不同主机,进程间通信。二、解决的问题1. 主机与主机之间物理层面必须互联互通。 2. 进程与进程在软件层面必须互联互通。物理层面的互联互通流程图如下:其中:IP地址:计算机的软件地址,用来标…