鸿蒙开发——冷启动、时延

673 阅读6分钟

一、基本概念

通常App性能通过以下几个方面来进行分析和优化

  • 冷启动
  • 响应时延、完成时延
  • 丢帧、卡顿
  • 内存大小、泄露
  • CPU
  • 包大小
  • 耗电情况

鸿蒙现阶段比较关注的是冷启动、点击响应(响应时延)、页面渲染完成(完成时延)、滑动加载完成、滑动帧率几个方面

二、冷启动

1、定义

  • 应用启动时,后台没有该应用的进程,需要创建一个进程分配给该应用
  • 主要包括点击桌面图标->图标发生变化(点击响应时延)->应用首帧渲染->应用首页加载完成并可操作(加载完成时延)
  • 建议冷启动完成时延时间为<=1100ms(应用首帧铺满全屏到首页占位符加载完成耗时)。

2、主要流程

image.png

2.1 应用进程创建&初始化阶段

该阶段主要是系统完成应用进程的创建以及初始化的过程,包含了启动页图标(startWindowIcon)的解码。

2.2 Application&Ability初始化

该阶段主要是资源加载、虚拟机创建、Application&Ability相关对象的创建与初始化、依赖模块的加载等。

  • 文件加载:查找并解析所有的文件到模块中记录。
  • 依赖模块解析(实例化):分配内存空间来存放模块所有导出的变量,此时内存中并没有分配变量的值。
  • 文件执行:运行.ets文件,将内存中之前未分配值的变量赋为真实的值。

2.3 Ability/AbilityStage生命周期

该阶段主要是AbilityStage/Ability的启动生命周期,执行相应的生命周期回调。

2.4 加载绘制首页

该阶段主要是加载首页内容、测量布局、刷新组件并绘制。

2.5 网络数据二次刷新

该阶段主要是应用根据业务需要对网络数据进行请求、处理、二次刷新。

3、优化点

3.1 缩短应用进程创建&初始化阶段耗时

  • 主要是系统完成应用进程的创建以及初始化的过程,包含了启动页图标(startWindowIcon)的解码,建议使用不超过256*256分辨率的图片作为启动页面图标,以减少图片解码带来的时延。

3.2 缩短Application&Ability初始化和生命周期耗时

  • 尽量不要执行耗时任务,可通过异步任务或延迟处理。
  • import模块按需加载,移除初始化阶段不需要的模块导入,动态加载耗时的模块。
  • 单HAP场景下,模块推荐使用多HAR,不推荐使用HSP

3.3 缩短首页渲染完成耗时

  • 网络请求预加载,提前在AbilityStage/UIAbility的onCreate()生命周期中发请求、网络缓存
  • 使用合理的布局结构、使用懒加载等UI优化方法来减少首页绘制时间。

三、冷启动分析

1、Dev Testing

可提供冷启动等性能相关测试数据

image.png

image.png

2、Profiler Launch

从进程创建到首页展示,主要问题是没法定位到渲染结束的具体时间点,可以辅助排查UIAbility 创建和生命周期内的耗时、首页组件绘制的耗时情况

image.png

  • Process Creating(进程创建)
  • Application Launching(Application创建)
  • UI Ability Launching (UIAbility创建)
  • UI Ability OnForeground (UIAbility生命周期相关)
  • First Frame - App Phase
  • First Frame - Render Phase
  • EntryAbility

2.1 UI Ability Launching

  • .abc File Loading(字节码文件加载)
  • In-depth Traversal of Imports(深入遍历导入)
  • .so File Loading(so文件加载)
  • onCreate (Ability 创建, 未执行onCreate方法)

2.2 UI Ability OnForeground

主要是各sdk初始化逻辑

3、自定义打点HiTraceMeter

HiTraceMeter提供系统性能打点接口。开发者通过在关键代码位置调用HiTraceMeter接口提供的API接口,能够有效跟踪进程轨迹、查看系统性能。直接在各生命周期增加Trace打点,在Profiler上可直接看到


// 第一个跟踪任务开始

hiTraceMeter.startTrace("myTraceTest", 1001);

// 结束taskId为1001的跟踪任务

hiTraceMeter.finishTrace("myTraceTest", 1001);

4、总结

主要可优化点主要集中在以下几个方面

  • 限制启动页图标

  • import延迟加载、按需加载

  • sdk等耗时任务通过异步或线程方式处理

  • 首页请求提前在UIAbility预加载、缓存处理

  • 首页合理布局和组件更新

四、时延

1、指标

1.1 响应时延

手指点击从离开屏幕到页面发生变化,建议响应时延应<=100ms。 点击后如果会有耗时操作,可以增加loading或者先修改UI状态

1.2 页面完成时延

手指从页面加载开始到应用所有占位符加载完成所需要的时间,建议完成时延≤900ms

1.3 滑动响应时延

手指从滑动到页面发生变化的时间。只要没有滑动冲突的相关问题,一般不需要特别优化。 抛滑(速度大于300mm/s )场景:触屏响应时延应<=80ms; 拖滑(速度小于100mm/s)场景:触屏响应时延应<=60ms。

1.4 滑动停止加载完成时延

在可滚动页面,当停止滚动开始算,到屏幕中占位符加载完成。建议完成时延≤100ms。

2、关于优化

主要是完成时延的优化,跟丢帧卡顿问题解决方案差不多,主要是ArkTs合理使用、ArkUI组件使用、网络请求或其他耗时任务的处理。

2.1 网络请求

一般采用预加载和缓存,一般在核心页面的入口处进行接口预加载。接口拆分,减少首屏接口的响应时间。

2.2 ArkUI组件

  • 长列表缓存及复用
  • 合理使用状态管理
  • 尽量给定组件宽高固定值
  • 使用合适的组件
  • 避免冗余组件嵌套

五、检测分析工具

image.png

1、性能检测工具

  • Code Linter:代码静态检测工具
  • App Analyzer:应用体检工具

2、性能分析工具

  • DevEco Profiler:场景化调优工具。支持冷启动、卡顿丢帧、ArKUI状态变量、网络、CPU、内存等详细分析能力。
  • ArkUI Inspector:UI布局分析工具。UI树可视化分析,识别组件布局和层次问题,优化节点布局。

叨叨叨:

  • 华为对性能检测还是比较严格的,有时候人眼感知不到少量的丢帧问题,还是会提相关性能问题。在使用Profiler中有时候还是定位不到具体组件或者函数,不确定是不是自己的打开方式不对。
  • ArkUI Inspector感觉用起来比安卓的更直观,而开发过程中安卓习惯了xml的边开发边预览,鸿蒙UI预览会相对繁琐。
  • CodeLinter也确实能提前暴露一些问题,但是还是会有误判,需要人为评估。

参考文档