Android中如何分析解决ANR问题

应用无响应(ANR,Application Not Responding)是 Android 应用程序在主线程(也称为 UI 线程)上执行耗时操作而导致的严重性能问题。通常,如果应用程序在 5 秒内未能对用户输入(如触摸事件或按键事件)做出响应,或在 10 秒内未能完成 BroadcastReceiver 的执行,系统会触发 ANR 对话框。

一、如何分析 ANR 问题

1. ANR 日志分析

ANR 事件会记录在 logcat 中,通过查看 ANR 日志,可以找到导致 ANR 的原因。ANR 日志通常包含以下信息:

  • 发生 ANR 的进程名称
  • 堆栈跟踪
  • 锁信息(如果涉及锁)

获取 ANR 日志:

  1. 连接设备并打开 Android Studio 的 Logcat 窗口。
  2. 过滤日志,找到包含 ActivityManagerANR 关键字的日志条目。
  3. 查看 ANR 日志中的堆栈跟踪,确定导致 ANR 的代码位置。

示例 ANR 日志:

E/ActivityManager: ANR in com.example.myapp (com.example.myapp/.MainActivity)
PID: 12345
Reason: Input dispatching timed out (Waiting because no window has focus but there is a focused application that may eventually add a window when it finishes starting up.)
    Load: 1.52 / 1.05 / 0.52
    CPU usage from 0ms to 10834ms later (2023-07-26 12:34:56.789):
    100% 12345/com.example.myapp: 60% user + 40% kernel / faults: 0 minor
    ...
    "main" prio=5 tid=1 TIMED_WAIT
      | group="main" sCount=1 dsCount=0 obj=0x734c0000 self=0x7f5a3ea000
      | sysTid=12345 nice=0 cgrp=default sched=0/0 handle=0x7f5b11e000
      | state=S schedstat=( 0 0 0 ) utm=236 stm=142 core=0 HZ=100
      | stack=0x7f5b110000-0x7f5b112000 stackSize=8192KB
      | held mutexes=
      at java.lang.Thread.sleep(Native Method)
      - sleeping on <0x0e38c058> (a java.lang.Object)
      at com.example.myapp.MainActivity.someLongRunningTask(MainActivity.java:123)
      at com.example.myapp.MainActivity.onCreate(MainActivity.java:45)
      ...
2. 使用 StrictMode

Android 提供了 StrictMode 类来检测应用中的潜在问题,如在主线程上执行网络操作或磁盘 I/O 操作。通过在开发阶段启用 StrictMode,可以提前发现并修复这些问题。

启用 StrictMode:

public class MyApplication extends Application {
   
   
    @Override
    public void onCreate() {
   
   
        super.onCreate();
        if (BuildConfig.DEBUG) {
   
   
            StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                .detectAll()
                .penaltyLog()
                .penaltyDialog()
                .build());
            StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                .detectAll()
                .penaltyLog
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬_小彬

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值