应用无响应(ANR,Application Not Responding)是 Android 应用程序在主线程(也称为 UI 线程)上执行耗时操作而导致的严重性能问题。通常,如果应用程序在 5 秒内未能对用户输入(如触摸事件或按键事件)做出响应,或在 10 秒内未能完成 BroadcastReceiver 的执行,系统会触发 ANR 对话框。
一、如何分析 ANR 问题
1. ANR 日志分析
ANR 事件会记录在 logcat 中,通过查看 ANR 日志,可以找到导致 ANR 的原因。ANR 日志通常包含以下信息:
- 发生 ANR 的进程名称
- 堆栈跟踪
- 锁信息(如果涉及锁)
获取 ANR 日志:
- 连接设备并打开 Android Studio 的 Logcat 窗口。
- 过滤日志,找到包含
ActivityManager和ANR关键字的日志条目。 - 查看 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

最低0.47元/天 解锁文章
366

被折叠的 条评论
为什么被折叠?



