Android 学看ANR日志(2021.11.3)

()ANR也算是比较常见的情况,虽然我们大多数可以把锅甩给用户的手机,但是有时候也有甩不动锅的时候

这篇博客的主题是教大家如何看ANR日志,然后就是分析ANR日志

一.预备工作

1.配置环境

配置环境,如果已经配置过的就跳过,在PC的在系统变量中path变量后面添加adb.exe的路径,我的路径是D:\Android\sdk\platform-tools 
添加完之后用PC的cmd命令行窗口输入adb,会出现adb的版本号

但是AS还是不行,还需要将adb.exe 、AdbWinApi.dll、 AdbWinUsbApi.dll 三个文件拷贝至windows系的 C:\Windows\System 和 C:\Windows\System32文件夹中。

参考:android studio 'adb' 不是内部或外部命令,也不是可运行的程序_刘_sir的博客-CSDN博客

2.获取ANR日志

当手机出现ANR,就会在data/anr/traces.txt里添加相关记录。
在AS的 terminal 下通过adb命令拿到该文件:adb bugreport ,然后我们在项目的 FS\data\anr 目录下就可以看到了


二.分析日志

1.触摸事件ANR

首先我运行一个会产生ANR的代码,一看就知道这个属于触摸事件ANR

        btn_one.setOnTouchListener { v, event ->
            Thread.sleep(1000000)
            false
        }

因为一个日志文件包含了所有应用的ANR信息,所以我们要去找哪一个是我们想看的,因为最新的ANR会在最上面,所以也好找

注意这一句,它有我们的包名,所以可以断定这是我们想看的ANR信息

Cmd line: appupdate.bitpai.com.test

继续往下看,堆内存信息 22%空闲,这个应用堆内存总共分配了12MB

Heap: 22% free, 10MB/12MB; 40193 objects

然后我们往下翻,查看线程的信息,直到我们看见了下面这个,main指的是主线程,prio线程优先级,tid线程锁ID,sleeping指的是线程在休眠,因为我执行了sleep方法, ”

"main" prio=5 tid=1 Sleeping

不过还没完,下面的信息有一句提到了我写的代码,这个24指的是我那句sleep命令的位置

at appupdate.bitpai.com.test.MainActivity$onCreate$1.onTouch(MainActivity.kt:24)

虽然有点长,但是还是放出来一段,因为他说了我堵塞了那些代码的执行,因为onTouch是在dispatchTouchEvent里执行的,所以,有这一段是应该的

 at java.lang.Thread.sleep(Thread.java:327)
  at appupdate.bitpai.com.test.MainActivity$onCreate$1.onTouch(MainActivity.kt:24)
  at android.view.View.dispatchTouchEvent(View.java:11784)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974)
  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2604)
  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2974)

关于触摸事件ANR主要判断在于是否有相关 分发函数 在其中被卡住

2.Service onStartCommand执行超时

我启动一个service,因为无线循环的原因,会产生ANR

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        int i=0;
        boolean tag=true;
        for(;tag;){
            i=i+1;
        }
        return super.onStartCommand(intent, flags, startId);
    }

看一下日志,主线程运行中,但是因为在onstart里执行半天都没结束,所以报ANR了

"main" prio=5 tid=1 Runnable
  | group="main" sCount=0 dsCount=0 flags=0 obj=0x7302fa20 self=0x7f17ea3a00
  | sysTid=10854 nice=-10 cgrp=default sched=0/0 handle=0x7f1cd649b0
  | state=R schedstat=( 10991954159 32071357 850 ) utm=1088 stm=11 core=6 HZ=100
  | stack=0x7fc2b17000-0x7fc2b19000 stackSize=8MB
  | held mutexes= "mutator lock"(shared held)
  at appupdate.bitpai.com.test.MyService.onStartCommand(MyService.java:20)
  at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4151)

3.小结

虽然上面的两个例子通过 日志很快就可以知道 问题所在,但是具体到我们平常的ANR发生情况里,还是算比较简单的了。需要仔细盘查和大胆猜测

参考文章

掘金

在Android studio中使用adb命令_king_jie0210的专栏-CSDN博客

Android 11 com.android.phone ANR是指在运行Android 11操作系统时,手机中的电话应用程序(com.android.phone)发生了ANR的情况。 ANRAndroid系统中的一个常见问题,即应用程序无响应(Application Not Responding)。当应用程序无法在一定时间内响应用户的操作或系统的请求时,Android系统就会认为应用程序出现ANR。 com.android.phone是系统中负责电话功能的应用程序。当该应用程序发生ANR时,可能出现以下情况: 1. 用户在拨打或接听电话时,电话应用程序无法响应,导致通话无法进行或无法结束通话。 2. 在电话应用程序中查看或编辑联系人时,应用程序无响应,导致联系人操作无法完成。 3.当应用程序在后台运行时,可能会影响到其他应用程序的正常使用,导致整个系统变慢或卡顿。 出现ANR的原因可能是电话应用程序执行的操作过于复杂,导致处理时间过长,从而无法及时响应用户的输入或系统的请求。或者是某些软件或系统错误导致电话应用程序中断。 为了解决这个问题,可以尝试以下方法: 1.重启手机:有时,重启可以解决临时的系统问题,恢复电话应用程序的正常运行。 2.升级或更新系统:确保手机上安装了最新版本的Android操作系统,可以修复已知的系统错误和漏洞。 3.清除应用程序缓存:通过进入手机设置,找到应用程序管理,清除电话应用程序的缓存,有时可以解决ANR问题。 4.卸载不需要的应用程序:清理手机上不必要的应用程序,释放内存,减少系统负担,提高系统运行效率。 如果以上方法无效,建议联系手机制造商或系统开发商,寻求更详细的帮助或解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值