一、基本概念
通常App性能通过以下几个方面来进行分析和优化
- 冷启动
- 响应时延、完成时延
- 丢帧、卡顿
- 内存大小、泄露
- CPU
- 包大小
- 耗电情况
鸿蒙现阶段比较关注的是冷启动、点击响应(响应时延)、页面渲染完成(完成时延)、滑动加载完成、滑动帧率几个方面
二、冷启动
1、定义
- 应用启动时,后台没有该应用的进程,需要创建一个进程分配给该应用。建议冷启动时间为<=1100ms。
- 主要包括点击桌面图标->图标发生变化(点击响应时延)->应用首帧渲染->应用首页加载完成并可操作(加载完成时延)
2、主要流程
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、指标
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组件
- 长列表缓存及复用
- 合理使用状态管理
- 尽量给定组件宽高固定值
- 使用合适的组件
- 避免冗余组件嵌套
四、检测分析工具
1、性能检测工具
- Code Linter:代码静态检测工具
- App Analyzer:应用体检工具
2、性能分析工具
- DevEco Profiler:场景化调优工具。支持冷启动、卡顿丢帧、ArKUI状态变量、网络、CPU、内存等详细分析能力。
- ArkUI Inspector:UI布局分析工具。UI树可视化分析,识别组件布局和层次问题,优化节点布局。
叨叨叨:
- 华为对性能检测还是比较严格的,有时候人眼感知不到少量的丢帧问题,还是会提相关性能问题。在使用Profiler中有时候还是定位不到具体组件或者函数,不确定是不是自己的打开方式不对。
- ArkUI Inspector感觉用起来比安卓的更直观,而开发过程中安卓习惯了xml的边开发边预览,鸿蒙UI预览会相对繁琐。
- CodeLinter也确实能提前暴露一些问题,但是还是会有误判,需要人为评估。