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

性能优化中使用Profiler进行页面卡顿的排查及解决方式

文章目录

  • 一、前言
  • 二、页面卡顿的排查方式
    • 1、耗时操作的监控
    • 2、页面卡顿的监控
  • 三、参考链接

一、前言

程序的优化在做过线上bug处理,布局层级优化,项目依赖库版本更新,重复库合并,删除未使用的资源,删除冗余的库,避免因为一个类而引入一个库的问题,leakcanary(参考链接:https://square.github.io/leakcanary/)内存检测处理,lint(参考链接:https://developer.android.google.cn/studio/write/lint?hl=zh-cn)静态代码检测后。如果想要继续优化,那么就需要使用其他工具了。比如开启严格模式StrictMode,该模式会将相关异常信息输出到控制台或者弹出对话框。亦或者使用Profiler等工具进行进行检测(需要注意的是Profiler只能解决一部分问题,不能解决所有问题)

需要注意的是本篇文章采用了Android Studio新版的UI进行操作,具体开启方式为Preferences->Appearance & Behavior ->New UI 。然后勾选Enable new UI并重启Android Studio。开发工具版本为

Android Studio Giraffe | 2022.3.1 Patch 4
Build #AI-223.8836.35.2231.11090377, built on November 14, 2023
Runtime version: 17.0.6+0-17.0.6b829.9-10027231 aarch64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.

目前为最新版本开发工具。
测试工具为红米K60,版本为Android13
据官方文档所说Profiler的工具监控UI在Android11、12、13上面的UI有不同的结果,这里需要注意版本不同带来的问题

如需打开 Profiler 窗口,请依次选择 View > Tool Windows > Profiler,或点击工具栏中的 Profile 图标 在这里插入图片描述

二、页面卡顿的排查方式

1、耗时操作的监控

可以选择采取以下方式启动应用
在这里插入图片描述
或者常规方式启动后使用以下方式打开监控工具
在这里插入图片描述
打开后选择CPU栏目打开
在这里插入图片描述
然后选择Java/Kotlin Method Sample (legacy)进行记录。Java/Kotlin Method Trace在测试时候记录的数据无法打开,所以没办法进行测试,后续可以打开的时候再进行尝试。需要注意的是对数据记录时间不能过长,否则会导致文件过大无法打开。所以只对关键操作进行记录分析即可。记录完后点击Stop进行完成分析
在这里插入图片描述
记录完成后会自动打开,效果如下
在这里插入图片描述
选择左侧main选项卡进行确定然后查看Flame Chart。结果如下
在这里插入图片描述

其中右侧火焰图的绿色格子的内容是开发者可以尝试修改的地方。调用顺序从上往下为,应用函数到系统函数的调用顺序,鼠标光标悬停在某个方格上面可以看到该函数调用时长。然后开发者可以根据此进行相关代码修改。当然即使如此能修改的绿色格子也不足十分之一。

2、页面卡顿的监控

这里选择System Trace进行记录
在这里插入图片描述
记录完后的页面如下
在这里插入图片描述
然后选择All Frames->Janky Frames
在这里插入图片描述
可以通过点击Frame Duration进行选择排序,查看耗时最长的Frame的ID,如果该选项卡下面没有内容,表示应用没有页面卡顿。根据此帧在左侧Janky Frames的选项卡中进行查找该帧。
在这里插入图片描述
锁定后按动键盘上的M键放大或者屏幕右上角的放大缩小按钮放大缩小。
然后可查看具体帧的渲染时间,当然不是所有帧都能提供有效信息,那么就只能针对可以修改的地方进行修改
在这里插入图片描述
Profiler本文只记录部分用法,其余用法需查看官网或自己研究

三、参考链接

  1. 应用性能指南
  2. 使用布局检查器和布局验证工具调试布局
  3. StrictMode
  4. 功耗优化 · 方案篇 · Android功耗优化指导规范
  5. Android Profiler

相关文章:

  • Android——资源IDnonFinalResIds和“Attribute value must be constant”错误
  • ELFK集群部署(Filebeat+ELK) 本地收集nginx日志 远程收集多个日志
  • 异常 Exception 练习题 (未完成)
  • 合并PDF出现OOM异常
  • Oracle SQL优化
  • 【小白进阶】Linux 调试大法——gdb
  • 软件测评中心▏软件集成测试和功能测试之间的区别和联系简析
  • 02、Tensorflow实现手写数字识别(数字0-9)
  • 在线文库系统 转码功能源代码展示 支持文档在线预览查阅功能
  • Linux “grep“ 命令
  • 【代码随想录】算法训练计划37
  • ctfshow刷题web入门--1--ljcsd
  • 键盘打字盲打练习系列之刻意练习——1
  • 异常数据检测 | Python实现孤立森林(IsolationForest)异常检测
  • RabbitMQ 安装(在docker容器中安装)
  • 「前端」从UglifyJSPlugin强制开启css压缩探究webpack插件运行机制
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android 架构优化~MVP 架构改造
  • crontab执行失败的多种原因
  • java 多线程基础, 我觉得还是有必要看看的
  • JavaScript HTML DOM
  • Linux后台研发超实用命令总结
  • MD5加密原理解析及OC版原理实现
  • mysql中InnoDB引擎中页的概念
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redash本地开发环境搭建
  • SQLServer插入数据
  • 简单基于spring的redis配置(单机和集群模式)
  • 简单数学运算程序(不定期更新)
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 中文输入法与React文本输入框的问题与解决方案
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • #includecmath
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (26)4.7 字符函数和字符串函数
  • (4.10~4.16)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (搬运以学习)flask 上下文的实现
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十三)Flask之特殊装饰器详解
  • (新)网络工程师考点串讲与真题详解
  • (一)基于IDEA的JAVA基础12
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core开源商城系统源码,支持可视化布局小程序
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .Net 访问电子邮箱-LumiSoft.Net,好用