当前位置: 首页 > news >正文

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


 

目录

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

Android flutter项目 启动优化实战(二)利用 App Startup 优化项目和使用flutterboost中的问题解决

背景描述

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

在刚上线的Android 原生&flutter 的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.提升用户体验

相关文章:

  • SQL Server 2016(分离和附加数据库)
  • P1 什么是链表 C语言简单易懂
  • MOS管的静电击穿问题
  • 2023年12月03日新闻简报(国内国际)
  • 机器学习中参数优化或交叉验证评估指标含义
  • ASP.NET Core 使用IIS调试出现505.24错误
  • 软件工程 - 第8章 面向对象建模 - 4 - 物理体系结构建模
  • 【C语言:数据在内存中的存储】
  • CSS 选择器优先级,!important 也会被覆盖?
  • Python与设计模式--模板模式
  • TCP网络常见名词
  • 第八章 django
  • mysql原理--重新认识MySQL
  • 外包搞了6年,技术退步明显......
  • Android监听用户的截屏、投屏、录屏行为
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java编程基础24——递归练习
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • Mysql数据库的条件查询语句
  • nodejs:开发并发布一个nodejs包
  • scala基础语法(二)
  • ucore操作系统实验笔记 - 重新理解中断
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 线上 python http server profile 实践
  • 《码出高效》学习笔记与书中错误记录
  • PostgreSQL之连接数修改
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​业务双活的数据切换思路设计(下)
  • #HarmonyOS:基础语法
  • (27)4.8 习题课
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (libusb) usb口自动刷新
  • (ros//EnvironmentVariables)ros环境变量
  • (二)WCF的Binding模型
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三)docker:Dockerfile构建容器运行jar包
  • (十六)一篇文章学会Java的常用API
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • .axf 转化 .bin文件 的方法
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core跨平台微服务学习资源
  • .net mvc部分视图
  • .NET Reactor简单使用教程
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET序列化 serializable,反序列化
  • .net中应用SQL缓存(实例使用)
  • /etc/sudoer文件配置简析
  • @RequestParam详解
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [c#基础]值类型和引用类型的Equals,==的区别
  • [docker] Docker的数据卷、数据卷容器,容器互联