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

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具,用于时间性能分析,主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。通过图形化界面查看应用程序的代码执行细节,包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈等信息。我们可以通过它来定位性能瓶颈、不必要的函数调用,优化代码结构以及性能。


使用 Traceview 工具需要在代码中插入开始和结束追踪的方法:

Debug.startMethodTracing():开启监控

Debug.stopMethodTracing():停止监控

记录完成后,会生成一个.trace 文件,路径默认是/sdcard/Android/data/包名/files/dmtrace.trace

可以用 Android Studio 内置的 Profiler 工具来查看这个文件的可视化报告。


举个例子,在 MainActivity 中搞一个耗时操作:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<Button>(R.id.btn).setOnClickListener {Debug.startMethodTracing() // 开启监控longTimeOperation()Debug.stopMethodTracing()  // 关闭监控,生成 .trace 文件}}private fun longTimeOperation() {for (i in 0..10000) {Log.i("wk", "循环:$i")}Log.i("wk", "完成")}
}

点击 btn 后,首先开启监控,执行耗时操作后关闭监控,就会在默认的路径下生成 .trace 文件,把它保存在电脑本地(右键 -> Save As...) 

然后把这个 trace 文件直接拖进 Android Studio,它会自动使用 Profiler 打开:

在实际项目开发当中,会有比较多的线程,这里选择主线程(main)和火焰图(Flame Chart)查看主线程调用的代码执行细节:

 从火焰图中就可以得知:com.demo.traceview.MainActivity.longTimeOperation 这个方法比较耗时,我们就可以按照这个路径跟踪到方法里面去进行优化(比如放子线程等)


除了使用代码生成 trace,还可以使用 Profiler 生成:

在 Profiler 中选择好要监控的进程后,点击 CPU 模块

选择 Java/Kotlin Method Trace 后点击 Record 开始监控,手动进行耗时操作后点击 Stop 停止监控,它就会自动生成 trace 文件并打开,页面和步骤就跟上面的一样了


需要注意的是,因为 Traceview 会在运行时植入额外的检测代码,所以它会对应用程序的性能造成一定影响,所以一般不在生产环境中使用,只在开发阶段作为性能调试使用。

相关文章:

  • Angular系列教程之zone.js和NgZone
  • 在 SpringBoot中的WebSocket使用介绍
  • Nginx+Tomcat负载均衡、动静分离以及Nginx负载均衡和四层代理
  • macOS向ntfs格式的移动硬盘写数据
  • web开发学习笔记(2.js)
  • C#,字符串匹配(模式搜索)原生(Native)算法的源代码
  • Node cool 跨域问题的解决
  • kibana查看和展示es数据
  • 2024秋招,顺丰科技测试开发工程师一面
  • CleanMyMac X .4.14.7如何清理 Mac 系统?
  • yum仓库及NFS共享
  • openssl3.2 - 官方demo学习 - pkey - EVP_PKEY_DSA_keygen.c
  • 网页设计(十一)JavaScript事件分析
  • windows编译TensorFlowServing
  • 东北编程语言???
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 2018一半小结一波
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • iOS编译提示和导航提示
  • java2019面试题北京
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Magento 1.x 中文订单打印乱码
  • mysql外键的使用
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Phpstorm怎样批量删除空行?
  • Terraform入门 - 1. 安装Terraform
  • 产品三维模型在线预览
  • 服务器之间,相同帐号,实现免密钥登录
  • 微信小程序:实现悬浮返回和分享按钮
  • 微信小程序--------语音识别(前端自己也能玩)
  • 译自由幺半群
  • 容器镜像
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #考研#计算机文化知识1(局域网及网络互联)
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (27)4.8 习题课
  • (九)c52学习之旅-定时器
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (一)Neo4j下载安装以及初次使用
  • (一)RocketMQ初步认识
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)...
  • .net下简单快捷的数值高低位切换
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • @Transaction注解失效的几种场景(附有示例代码)
  • [ C++ ] STL---string类的模拟实现
  • [.net]官方水晶报表的使用以演示下载
  • [AIGC codze] Kafka 的 rebalance 机制
  • [AIGC] MySQL存储引擎详解
  • [AIGC] SQL中的数据添加和操作:数据类型介绍
  • [Android 数据通信] android cmwap接入点
  • [Android学习笔记]ScrollView的使用