Android flutter项目 启动优化实战(一)使用benchmark分析项目

背景描述

 启动时间是用户对应用的第一印象,较慢的加载会对用户的留存和互动造成负面影响

在刚上线的B端项目中:

  1.提高启动速度能提高整体流程的效率

  2.提高首次运行速度能提高应用推广的初体验效果

问题描述

        项目刚上线没多久、目前存在冷启动过程存在若干问题亟需优化 比如flutter hotrestart 不可用 、启动500ms黑屏问题

 初期项目的启动流程 

解决方案及工具

        从结果上分为两大类,其中之一是以SplashScreen为代表的体验优化方向, 另一个是懒加载、减少包体积等的功能性优化方向. 但到实际的业务场景中要与业务功能结合使用 与pm等人进行沟通.

没有专门大块的时间去搞优化 于是分优先级、分阶段实现

检测工具

 ​​​​​​​​​​​​​​Jetpack Macrobenchmark 库

Macrobenchmark 库可衡量更大规模的最终用户互动,例如启动、与界面交互和动画。此库可让您直接控制受测试的性能环境。借助它,您还可以通过控制编译、启动和停止应用来直接衡量实际的应用启动或滚动。

1.在项目中New Module出来

2.将配置改为你所需要的

@RunWith(AndroidJUnit4::class)
class ExampleStartupBenchmark {@get:Ruleval benchmarkRule = MacrobenchmarkRule()@Testfun startup() = benchmarkRule.measureRepeated(packageName = "com.test.app",//你的包名 metrics = listOf(StartupTimingMetric()),iterations = 5, //测试五次startupMode = StartupMode.COLD//冷启动方式) {pressHome()startActivityAndWait()}
}

3.更改配置及运行 

app部分为benchmark,把其他Module都改成release 后运行

那么以如下情况为例

优化前(0.0V)问题分析

生成结果

运行benchmark后生成结果:

Benchmark startup生成结果

结果有两个log Benchmark和device info,分别是当前程序数据和设备硬件信息 我们关注Benchmark下的两个指标 

Time to initial display & Time to full display

名称描述用处
初始显示时间(Time to initial display)

启动流程和完成在屏幕上绘制相应活动之间经过的时间量。 经过的时间包含以下事件序列:

  • 启动进程。

  • 初始化对象。

  • 创建并初始化Activity。

  • 加载布局。

  • 第一次绘制你的应用程序。

初始显示时间 能用户让觉得不卡

完全显示时间(Time to full display)测量应用程序启动和所有资源和视图层次结构的完整显示之间经过的时间完全显示时间 能用户正常使用

分析

         其中max时间很长、总体时间也不短  中位数接近最小值  

        作为初期项目 Time to initial display & Time to full display我全都要解决

接下来我们看看到底什么地方用了这么长时间 点击进入 Traces :Iteration具体如下图所示

        从启动到展示出来的每个信息 是否并行 顺序都在这里展示出来

启动数据展示
查看操作方式 点击大图查看

可以看到bindApplication时间很长等问题

确认优化点

综上并结合实际显示的问题有几个大的优化向:

1.缩短总时长(解决黑屏问题、懒启动、优化流程)、2.优化启动项(使用App Startup)、3.提升用户体验

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

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

相关文章

【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现

目录 说明: 1. 话题模型 图示 说明 2. 实现过程(C) 创建订阅者代码(C) 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程(Python) 创建订阅者代码(Python&…

LLM能力与应用全解析

一、简介 经过几年时间的发展,大语言模型(LLM)已经从新兴技术发展为主流技术。而以大模型为核心技术的产品将迎来全新迭代。大模型除了聊天机器人应用外,能否在其他领域产生应用价值?在回答这个问题前,需要…

产品解读:GreatADM如何快速改造单实例为双主、MGR、读写分离架构?

前言 单机GreatDB/GreatSQL/MySQL将架构调整为多副本复制的好处有哪些?为什么要调整? 性能优化:如果单个GreatDB服务器的处理能力达到瓶颈,可能需要通过主从复制、双主复制或MGR及其他高可用方案来提高整体性能。通过将读请求分发…

STM32 ADC转换器、串口输出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ADC是什么?二、STM32的ADC2.1 认识STM32 ADC2.2转换方式2.3 为什么要校准?2.4 采样时间计算2.5 触发方式2.6 多通道采集解决方案2.7…

手把手教你如何实现List——ArrayList

目录 前言: 线性表 顺序表 接口的实现 一. 打印顺序表 二.新增元素,默认在数组最后新增 三.在 pos 位置新增元素 四.判定是否包含某个元素 五. 查找某个元素对应的位置 六.获取 pos 位置的元素 七.给 pos 位置的元素设为 value 八.删除第一次出现的关键字k…

基于SSM的酒店预订管理系统设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

Matlab R2022b 安装成功小记

Matlab R2022b 安装成功小记 前言一、 下载链接二、 安装过程小记 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧! 前言 windows 10系统之前安装过Matlab R2010b做基础研究,最…

Anaconda离线下载torch与安装包

一、下载离线安装包 命令: pip download 安装包名 -d 安装到文件夹名 -i https://pypi.tuna.tsinghua.edu.cn/simple执行这样的命令就会把安装包的离线文件下载到指定文件夹中。 操作: 打开cmd命令行,并进入相应的目录中。 如果是tor…

k8s中pod的hostport端口突然无法访问故障处理

故障背景: 租户告知生产环境的sftp突然无法访问了,登录环境查看sftp服务运行都是正常的,访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查,看看哪里出了问题,看下sftp日志&#…

Docker基本操作---镜像与容器操作

Docker基本操作---镜像与容器操作 1. 操作镜像1.1 查看镜像1.2 删除镜像1.2.1 删除镜像1.2.2 强制删除镜像1.2.3 删除所有镜像 1.3 启动镜像1.4 常见错误1.4.1 image is being used by stopped container e3b9df6dc6ae 2 操作容器2.1 新建启动容器2.2 查看正在运行的容器2.3 退…

Unity学习笔记11

一、视频播放功能 1.如何让视频在游戏场景中播放? 在Assets目录下添加一个渲染器纹理,步骤:新建→渲染器纹理 首先在创建一个平面,想让视频在平面上显示。在平面上添加一个组件 Video Player 然后将视频文件拖拽到视频剪辑位置上…

黄金比例设计软件Goldie App mac中文版介绍

Goldie App mac是一款测量可视化黄金比例的工具。专门为设计师打造,可以帮助他们在Mac上测量和可视化黄金比例,从而轻松创建出完美、平衡的设计。 Goldie App mac体积小巧,可以驻留在系统的菜单栏之上,随时提供给用户调用。 拥有独…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

Dijkstra算法(贪心),Floyd-Warshall算法(动态规划), Bellman-Ford算法——用Python实现

图论中最短路径三剑客 前言一、Dijkstra算法(贪心)1.1 Dijkstra在生活中的应用举例1.2 设计思路1.3 算法应用实例1.3.1 以交通规划为例1.3.2 Dijkstra算法执行步骤1.3.3 python代码 1.4 时空复杂度 二、Floyd-Warshall算法(动态规划&#xff…

fiddler设置过滤你就这样做,一做一个不只声!

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤: 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

如何获取高质量的静态住宅IP代理?常见误区与注意事项

静态住宅IP代理在今天的网络营销领域扮演着至关重要的角色,静态住宅IP代理以其稳定性和高匿名性,为互联网业务提供了一个安全的执行环境。通过模拟真实用户的网络行为,这些IP代理降低了企业在网络营销活动中被识别和封禁的风险。它保护了企业…

echarts修改tooltip默认的圆点图标为其他样式

业务需求,默认是圆点,需要把线的由圆点改为线 红色线是理论,点是历史理论,绿色线是实际, 点是历史实际,在series里的顺序也是这样排的。 打印出来的params里的marker就是圆点,改这段代码就可以了…

使用STM32 HAL库驱动光电传感器的设计和优化

光电传感器在许多应用中起着重要的作用,例如自动计数、距离测量等。STM32微控制器和HAL库提供了丰富的功能和易于使用的接口,使得光电传感器的设计和优化变得更加便捷。本文将介绍如何使用STM32 HAL库驱动光电传感器的设计和优化,包括硬件设计…

OpenCV | 傅里叶变换——低通滤波器与高通滤波器

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 傅里叶变换 傅里叶变换的作用 高频:变化剧烈…

JAVA文件IO, File类, 字符流,字节流

文章目录 文件IO1. File2. IO流2.1 字符流2.1.1 Reader2.1.2 Writer 2.2 字节流2.2.1 InputStream2.2.2 FileInputStream2.2.3 利用Scanner进行字符读取2.2.4 OutputStream 文件IO I: Input, 从硬盘往内存读数据 O: Output, 从内存往硬盘输出数据 1. File Java 中通过 java…