首页 > 其他分享 >Android中对Log日志文件的分析(解决ANR)

Android中对Log日志文件的分析(解决ANR)

时间:2022-11-22 11:37:55浏览次数:42  
标签:lang java Log Method ANR Android android View


一.概述

ANR使我们日常开发中偶尔会遇到的一种情况,也就是应用程序无响应,其实在应用出现ANR的时候,系统会在控制台给出错误提示,并且会产生一个相关的日志文件,今天我们就来分析一下。

二.分析

首先我们要模拟一个ANR现象,很简单,下面的代码就可以实现,

public void click(View view){
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

我们在按钮的点击事件里面让主线程休眠足够的时间,这里设为10秒,点击按钮后,我们继续不停的点击屏幕,很快就会出现ANR现象,这时候就产生了一个文件,那么这个文件在哪里呢?在data/anr文件下,文件的名称是traces.txt。在这之前我们先看看控制台的错误信息

Android中对Log日志文件的分析(解决ANR)_android

已经提示我们ANR在哪个文件里面出现了。
接下来该看看日志文件了,在这之前我先讲讲什么时候系统会产生日志文件
1,程序异常退出,uncausedexception (Fatal)
2,程序强制关闭,ForceClosed (简称FC) (Fatal)
3,程序无响应,ApplicationNo Response(简称ANR)
ANR出现的情况有以下两种
A 界面操作按钮的点击等待响应时间超过5秒
B HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒

这时候我们来看系统产生的日志,在data/anr目录下的traces.txt,

----- pid 1761 at 2016-03-10 06:16:34 -----
Cmd line: com.example.activityandservice

DALVIK THREADS:
(mutexes: tll=0 tsl=0 tscl=0 ghl=0)

"main" prio=5 tid=1 TIMED_WAIT
| group="main" sCount=1 dsCount=0 obj=0xb5d33938 self=0xb9295e80
| sysTid=1761 nice=0 sched=0/0 cgrp=[fopen-error:2] handle=-1208127328
| state=S schedstat=( 0 0 0 ) utm=2 stm=17 core=0
at java.lang.VMThread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:1031)
at java.lang.Thread.sleep(Thread.java:1013)
at com.example.activityandservice.MainActivity.click(MainActivity.java:25)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at android.view.View$1.onClick(View.java:3592)
at android.view.View.performClick(View.java:4202)
at android.view.View$PerformClick.run(View.java:17340)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5039)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)

这个文件里面保存的是虚拟机信息,我们在这只给出了tid为1也就是主线程的信息,然后我们就看到这样一条信息

at com.example.activityandservice.MainActivity.click(MainActivity.java:25)

于是我们定位到代码

Android中对Log日志文件的分析(解决ANR)_日志文件_02

我们看到就是因为25线程休眠时间过长导致的ANR,这下就可以想办法解决了。


标签:lang,java,Log,Method,ANR,Android,android,View
From: https://blog.51cto.com/u_10847930/5877244

相关文章

  • Android webview实战
    今天来使用webview进行一个实例演练,可以基本用到任何地方,目的在于熟悉一下webview的使用,基本算是入门的吧。先看一下效果图,接下来我们看看如何实现第一步:首先加载网页......
  • 从setContentView分析Android加载布局的流程
    一.概述在Activity中,我们基本都会用到setContentView方法,这个方法是干啥的想必大家都知道,把我们写好的布局文件显示到界面上。今天我们就去看看底层的源码,分析一下到底是如......
  • 从源码的角度理解Android消息处理机制
    总结与Handler共同作用的有Looper,MessageQueue,Message。我么接下来从源码的角度看看整个过程的大概实现。首先说一下每个对象的作用:Looper:消息轮询循器,不断的从消息队......
  • Android命令行查看内存情况
    在学习如何查看内存前先来介绍几个概念VSS-VirtualSetSize虚拟耗用内存(包含共享库占用的内存)RSS-ResidentSetSize实际使用物理内存(包含共享库占用的内存)PSS......
  • Android实现3D页面加载进度条动画
    一.概述最近在研究公司的代码,发现每次切换页面时做的进度条效果还挺不错的,所以想深入研究一下,今天就带大家来看看到底是如何实现的,首先上效果图二.实现上面的进度条最大的......
  • Android使用MAT分析内存泄露
    一.概述首先来普及一下什么是内存泄露:内存泄露是指对象的内存在分配之后无法通过程序的执行逻辑释放对该对象的引用,导致不能回收该对象所占内存。内存泄露会导致以下情......
  • Android网络类型判断
    在Android开发中,我们有时候需要根据当前网络的类型去做一些操作,下面看看如何判断当前网络的状况:publicclassNetWorkUtil{privatestaticConnectivityManagermanage......
  • java日志之log4j、log4j2、slf4j以及整合关系
    了解log4j、log4j2之间的关系;以及与slf4j整合时使用的中间jar包:slf4j-log4j12、log4j-slf4j-impl。1.Log4jlog4j核心包只有一个,即log4j.jar。上图是log4j最后的版本......
  • Unity :Android局域网通信、UDP广播实现控制器开关(继电器)
    要解决的问题:1.UDP广播:因为平板控制的不仅仅是继电器,还有其他电脑2.继电器接收的是16进制指令,所以要把12个按钮1-12转换成16进制,要不然一个个的发送太麻烦,这里是指令的理......
  • .NET6使用NLog向文件、数据库写数据
    1.Nuget引入NLogNLog.Web.AspNetCoreNLog.Database(写入数据库使用)2.创建nlog.config注意数据库连接字符串需要配置TrustServerCertificate=True;不然会有认证问题......