如何监测Android应用卡顿?这篇就够了

本文首发于微信公众号「Android开发之旅」,欢迎关注

Jetpack版Wan-Android项目地址:Android Jetpack架构开发组件化应用实战 欢迎star

Flutter版Wan-Android项目地址:Flutter版Wan-Android 欢迎star

卡顿介绍

用户在使用我们应用的时候,很多问题是很难被及时的发现的比如内存占用高,耗费流量等,但是一旦发生卡顿就会被用户直观的感受到。所以应用卡顿是很影响用户体验的。另外一方面,对于开发者来说,卡顿的问题很难定位,发生问题的原因错综复杂,比如:代码问题、内存问题、绘制问题以及IO操作等等。而且线上发生的卡顿问题在线下我们很难复现,因为这和用户当时的系统环境有很大的关系,因此我们需要在用户发送卡顿的时候记录下用户使用的场景等。比如:内存消耗,磁盘空间,用户行为路径等等。

优化工具

CPU Profile

目前Android Studio以及自带了CPU Profiler工具,它可以以图形化的形式展示执行的时间、调用栈等信息。收集的信息比较全面,包含了所有线程。但是由于其收集信息全面,导致了运行时内存开销严重,App函数整体运行都会变慢,可能会带偏我们的优化方向。

使用方式:

Debug.startMethodTracing();
...
Debug.stopMethodTracing();

最终生成的文件在sd卡:Android/data/packagename/files目录下。

Systrace

Systrace之前文章已经讲解过,它是轻量级的框架,而且开销小,可以直观反映CPU的利用率而且右侧alter可以针对一些问题给出相关的建议。 比如绘制慢或者GC频繁等。

StrictMode

Android2.3引入的一个工具类:严苛模式。是一种运行时检测机制。可以帮助开发人员检测代码当中不规范的问题。StrictMode主要检测线程策略和虚拟机策略。

线程策略包括:

  • 自定义的耗时调用,detectCustimSlowCalls

  • 磁盘读取操作,detectDiskReads

  • 网络操作,detectNetwork

虚拟机策略:

  • Activity泄漏,detectActivityLeaks

  • Sqlite对象泄漏,detectLeakedSqlLiteObjects

  • 检测实例数量,setClassInstanceLimit

我们在Application中使用:

    private void initStrictMode() {if (BuildConfig.DEBUG) {//线程StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectCustomSlowCalls() //API等级11,使用StrictMode.noteSlowCode.detectDiskReads().detectDiskWrites().detectNetwork()// 或者直接使用 .detectAll() 手机全部信息.penaltyLog() //在Logcat 中打印违规异常信息,还可以选择弹框提示或者直接奔溃等.build());//虚拟机StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().setClassInstanceLimit(StrictModeTest.class, 1).detectLeakedClosableObjects() //API等级11.penaltyDropBox().build());}}

StrictMode本身也是耗性能的,所以我们只在debug模式下开启。当出现不符合检测策略的时候就会在控制台打印日志,输入StrictMode关键词过滤即可。

自动化检测卡顿方法

CPU Profiler 和 Systrace 都是适合线下使用的,无法带到线上。那我们如何做到线上监测卡顿呢?

我们都知道一个进程中只有个Looper对象,我们通过查看Looper源码发现,在其loop方法中的死循环中有个mLogging对象,在执行的时候打印了一个Dispatching to日志,执行完成的时候有打印了一个Finished to日志。如:

public static void loop() {// ....省略开始代码...for (;;) {Message msg = queue.next(); // might blockif (msg == null) {// No message indicates that the message queue is quitting.return;}
​// This must be in a local variable, in case a UI event sets the loggerfinal Printer logging = me.mLogging;if (logging != null) {//重点 开始打印logging.println(">>>>> Dispatching to " + msg.target + " " +msg.callback + ": " + msg.what);}// ...省略中间代码...if (logging != null) {//重点 完成打印logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);}
​// ...省略最后代码...}}

所以我们可以自定义Printer对象,让Handler的日志都通过我们自定义的Printer进行打印,然后收集日志信息,匹配Dispatching to和Finished to字段,如果在设定的某个时间内只有Dispatching to字段而没有Finished to字段,那么就说明发生了卡顿。发生卡顿后我们就收集此时的调用栈信息。相反如果两个字段都存在则说明应用运行的很流畅。

字段Printer设置给mLogging对象:

Looper.getMainLooper().setMessageLogging(new Printer() {@Overridepublic void println(String log) {Log.e("printer","==println=="+log);}
});

代码中的log字段就是我们需要的Dispatch和Finished字段,我们监测这两个字段并收集调用栈信息将其发送到后端进行分析使用。

那么这里其实还存在一个问题就是可能我们收集的信息不够准确,为什么呢?就是我们收集的调用栈信息是最后收集的,那么这个时候有可能卡顿已经执行完成了,此刻搜集到的信息有可能不是卡顿发生的关键信息。就像OOM一样,它是一个随时都有可能发生的。所以我们需要高频率的收集日志信息,高频率的收集对后端有一定的压力,而我们高频收集的信息有很大一部分也是重复的,所以就需要日志去重操作。

ANR异常

ANR异常全称 Application Not Responding,即应用无响应。如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr。因为这很影响用户的使用体验,当然由于厂商深度定制系统的原因,在某些手机上发生ANR也不会弹框的。

发生ANR到弹框在不同的组件之间时间定义是不一样的,按键是5秒。前台广播10秒,后台广播60秒。前台服务20秒,后台服务200秒。这些数据都定义在AMS中,读者可以去看看。

ANR发生执行的流程:

在这里插入图片描述

ANR的日志在data/anr/traces.txt目录下。

我们在线下的时候可以直接通过ADB命令来查看日志:

adb pull data/anr/traces.txt 你的目录
这样可以详细分析CPU、IO、锁等操作的问题所在。

线上我们可以使用FileObserver监控文件变化,但是这种方法在高版本系统中有权限问题。另外一种就是使用AnrWatchDog框架。这也是一个开源框架,地址:https://github.com/SalomonBrys/ANR-WatchDog。它的原理就是通过修改值的方式判断UI线程是否发生卡顿。

在这里插入图片描述

这个库使用也非常简单,首先在gradle中配置:

compile 'com.github.anrwatchdog:anrwatchdog:1.4.0'

然后在Application中进行初始化:

new ANRWatchDog().start();

这样就可以了。默认检测到卡顿就直接抛ANRError异常将应用奔溃,我们可以复写Listener接口来抓取堆栈信息。

ANRWatchDog是继承之Thread线程的,那么我们就看下核心方法run方法中的代码逻辑。

    // post的操作private final Runnable _ticker = new Runnable() {@Override public void run() {_tick = 0;_reported = false;}};
@Overridepublic void run() {// 首先对线程进行重命名setName("|ANR-WatchDog|");
​long interval = _timeoutInterval;while (!isInterrupted()) {boolean needPost = _tick == 0;_tick += interval;if (needPost) {// 发送post_uiHandler.post(_ticker);}
​try {// 睡眠Thread.sleep(interval);} catch (InterruptedException e) {_interruptionListener.onInterrupted(e);return ;}
​// If the main thread has not handled _ticker, it is blocked. ANR.if (_tick != 0 && !_reported) {//noinspection ConstantConditionsif (!_ignoreDebugger && (Debug.isDebuggerConnected() || Debug.waitingForDebugger())) {Log.w("ANRWatchdog", "An ANR was detected but ignored because the debugger is connected (you can prevent this with setIgnoreDebugger(true))");_reported = true;continue ;}
​interval = _anrInterceptor.intercept(_tick);if (interval > 0) {continue;}
​final ANRError error;if (_namePrefix != null) {error = ANRError.New(_tick, _namePrefix, _logThreadsWithoutStackTrace);} else {error = ANRError.NewMainOnly(_tick);}_anrListener.onAppNotResponding(error);interval = _timeoutInterval;_reported = true;}}}

使用ANRWatchDog的原因就是它是非侵入式的,并且可以弥补高版本权限问题。二者结合使用。

以上就是对应用卡顿检测的方法。那么具体如何规避卡顿,这就要求我们在平时的开发中养成良好的代码习惯。书写高质量代码。具体请看下面往期回顾中的布局优化实战。

往期推荐

Android性能优化之布局优化实战

Android性能优化之启动优化实战

扫描下方二维码关注公众号,及时获取文章推送。

在这里插入图片描述

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

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

相关文章

Android卡顿优化

一. Android渲染知识 1.1 绘制原理 Android系统要求每一帧都要在 16ms 内绘制完成&#xff0c;平滑的完成一帧意味着任何特殊的帧需要执行所有的渲染代码&#xff08;包括 framework 发送给 GPU 和 CPU 绘制到缓冲区的命令&#xff09;都要在 16ms 内完成&#xff0c;保持流畅…

解决安卓手机卡顿的七个技巧

转载自:http://www.7to.cn/news/detail/3446.html 导读&#xff1a;最近&#xff0c;有用户吐槽自己的手机越来越卡&#xff0c;其实这不是手机的问题&#xff0c;而安卓运行机制的缺陷。虽然安卓系统512MB也能流畅运行&#xff0c;但这仅仅是系统流畅&#xff0c;现在手机APP都…

全网最新:面向Android开发中的“卡顿问题及解决方法”

前言 Android开发中卡顿问题一直是个比较棘手又重要的问题&#xff0c;严重影响用户体验&#xff1b;卡顿是人的一种视觉感受&#xff0c;比如我们滑动界面时&#xff0c;如果滑动不流畅我们就会有卡顿的感觉&#xff0c;这种感觉我们需要有一个量化指标&#xff0c;在编程时如…

Android 卡顿调研

/ 今日科技快讯 / 近日&#xff0c;新华社发文评价盲盒经济称&#xff0c;盲盒不仅成为一个经济现象&#xff0c;也反映了当下中国年轻人&#xff0c;特别是“95后”一代的心理和生活状态。惊喜和期待的背后&#xff0c;“盲盒热”所带来的上瘾和赌博心理也在滋生畸形消费&…

安卓-页面卡顿-分析方法

界面卡顿影响的页面 &#xff1a; ListViewScrollView有动画的页面 分析步骤 打开调试开发者选项&#xff0c;GPU呈现模式分析如果蓝色部分比较高&#xff0c;说明是UI线程性能问题红色部分比较高&#xff0c;应该是DrawList比较复杂&#xff0c;这部分可能跟蓝色部分相关。目…

Android手机为何不再卡顿?性能优化才是安卓起飞关键

现在谈到挂载 Android系统的 手机&#xff0c;大部分人的印象早已不像前几年&#xff0c;几年前的安卓机那是用了一段时间就变得有点卡顿&#xff0c;用1年就卡的动弹不得&#xff0c;不得不每年都更换新机。 为什么以前会出现这种情况呢&#xff1f;其实主要是有些程序在运行…

Android App 反应卡顿解决方案

Android App 反应卡顿&#xff0c;从技术上将就是UI 渲染慢。 UI渲染是从您的应用程序生成一个框架并将其显示在屏幕上的行为。 为了确保用户与您的应用程序的交互顺利&#xff0c;您的应用程序应该在16ms内渲染帧数达到每秒60帧&#xff08;为什么60fps&#xff1f;&#xff…

中文大模型评估基准:C-EVAL: A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models

论文&#xff1a;https://arxiv.org/abs/2305.08322 网站&#xff1a;C-Eval: A Multi-Level Multi-Discipline Chinese Evaluation Suite for Foundation Models 一、导言 随着大语言模型的迅速发展&#xff0c;如何评估一个大模型的能力也成为了一个重要的话题&#xff0c…

「国际科技信息中心SCITIC论坛」从细胞、基因和人工智能,探讨智慧医疗的机遇和挑战...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 2023年3月22日&#xff0c;由国际科技信息中心主办&#xff0c;AI TIME承办的SCITIC论坛“细胞&#xff0c;基因和人工智能&#xff1a;探索医学研究的未来”完美收官。SCITIC论坛由国际科技信息中心倾力打造&a…

C-Eval:构造中文大模型的知识评估基准

作者&#xff1a;符尧&#xff0c;何俊贤 排版&#xff1a;宋梓瑜 来源&#xff1a;海外独角兽 本项目立项于 2023 年 2 月 28 日&#xff0c;由上海交通大学、清华大学和爱丁堡大学共同完成&#xff0c;发布于 2023 年 5 月 22 日&#xff0c;原文链接&#xff1a;https://yao…

GPT(Chat)原理及其应用

摘要 遥想以往&#xff0c;人类沟通的方式只有口头或书面文字&#xff0c;但现在随着科技的发展&#xff0c;人类的沟通方式又得到了革命性的变化&#xff0c;即通过聊天机器人实现人机沟通。而GPT(Chat)中文聊天机器人又是其中的一种&#xff0c;它可以通过技术手段来自然地与…

AI:什么是智能?

本篇文章是博主在人工智能等领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对人工智能等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅解。文章分类在学习摘录和笔记专…

ChatGPT推荐的开源项目,到底靠不靠谱?

今天我们让ChatGPT推荐一些开源项目&#xff0c;看看这些项目到底靠不靠谱&#xff1f; 首先&#xff0c;我们需要明确一个概念&#xff0c;那就是什么是开源项目。开源项目是指代码开放、可自由使用、修改和分发的软件项目。开源项目的优点显而易见&#xff0c;它们免费、透明…

餐饮行业最新的经营模式——私域运营案例

疫情让许多企业发展面临巨大压力&#xff0c;而私域流量在这个时刻成为很多餐饮企业爱如珍宝的“救命稻草”。甚至有人预言&#xff0c;今年将可能是餐饮私域流量醒觉得第一年。目睹着越来越多的餐饮企业其中甚至还有餐饮大牌企业都加入私域流量中来。但好多餐饮人都不太了解私…

基于PHP的餐饮行业管理系统

第一章 绪论 1.1 系统开发背景 近年来&#xff0c;基于用户对网络信息传递的实时性以及高效性等方面的需求&#xff0c;使得信息化技术手段以及相关的产业结构得到的飞速的发展&#xff0c;其中最为出众的当属电商化的运营管理模式&#xff0c;其一经推广便受到了广泛的关注。…

【完善】微信餐厅点单小程序+后台管理系统的设计与实现(python实现)

前言 本文为完善上一篇文章餐厅点单小程序后台管理管理系统的设计与实现&#xff0c;旨在帮助有需要的小伙伴&#xff0c;更好的入门学习python3 djangovue开发的前后端分离框架。话不多说&#xff0c;开始我们的学习吧&#xff5e; 项目介绍 本次系统设计分两大模块&#x…

餐饮门店数字化转型|餐厅管理系统小程序

餐饮行业规模非常庞大&#xff0c;每年都有大量公司或个体户入局&#xff0c;国内各类美食非常多&#xff0c;不同品类菜品都有大量需求&#xff0c;以前几乎在业的餐饮门店&#xff0c;只要运营得当&#xff0c;挣多挣少总归是有利的&#xff0c;也能很好的生存下去&#xff0…

【餐厅点餐平台|一】项目描述+需求分析

餐厅点餐平台导航 【餐厅点餐平台&#xff5c;一】项目描述需求分析 https://blog.csdn.net/weixin_46291251/article/details/126414430 【餐厅点餐平台&#xff5c;二】总体设计 https://blog.csdn.net/weixin_46291251/article/details/126422811 【餐厅点餐平台&#xff5…

校园外卖点餐系统——Day02【员工管理业务开发】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

餐道中台如何赋能餐饮零售企业?

前不久&#xff0c;餐道A轮融资1亿元&#xff0c;是近期餐饮行业信息化领域最大的一笔。这家公司融资的目的是为了加强“SaaS 业务数据双中台”系统研发。那么&#xff0c;这家公司是谁&#xff0c;为什能拿到融资&#xff0c;此次融资之后会朝着何处发展&#xff0c;为业内带来…