https://github.com/SalomonBrys/ANR-WatchDog 我们使用的是ANR-WatchDog,这是github的地址
首先引入该依赖
dependencies {
implementation 'com.github.anrwatchdog:anrwatchdog:1.3.0'
}
其次,创建MyApplication类,调用ANRWatchDog类的start()方法
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
new ANRWatchDog().start();
}
}
简单吧,这样就可以检测ANR异常了。
我们测试下
package com.example.test_0725;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
看下日志打印输出
Process: com.example.test_0725, PID: 23761
com.github.anrwatchdog.ANRError: Application Not Responding
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: main (state = TIMED_WAITING)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:1031)
at java.lang.Thread.sleep(Thread.java:985)
at
com.example.test_0725.MainActivity.onCreate(MainActivity.java:13)
-----------------------------------------------------------------
at android.app.Activity.performCreate(Activity.java:6303)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2410)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2521)
at android.app.ActivityThread.access$1000(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1380)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:5600)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:752)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:642)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FileObserver (state = RUNNABLE)
at android.os.FileObserver$ObserverThread.observe(Native Method)
at android.os.FileObserver$ObserverThread.run(FileObserver.java:85)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerDaemon (state = WAITING)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:423)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:101)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:72)
at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:217)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerWatchdogDaemon (state = WAITING)
at java.lang.Object.wait(Native Method)
at java.lang.Daemons$FinalizerWatchdogDaemon.sleepUntilNeeded(Daemons.java:279)
at java.lang.Daemons$FinalizerWatchdogDaemon.run(Daemons.java:259)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: HeapTaskDaemon (state = BLOCKED)
at dalvik.system.VMRuntime.runHeapTasks(Native Method)
at java.lang.Daemons$HeapTaskDaemon.run(Daemons.java:443)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: ReferenceQueueDaemon (state = WAITING)
at java.lang.Object.wait(Native Method)
at java.lang.Daemons$ReferenceQueueDaemon.run(Daemons.java:152)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: Thread-5089 (state = RUNNABLE)
at android.net.LocalSocketImpl.accept(Native Method)
at android.net.LocalSocketImpl.accept(LocalSocketImpl.java:331)
at android.net.LocalServerSocket.accept(LocalServerSocket.java:90)
at com.android.tools.ir.server.Server$SocketServerThread.run(Server.java:165)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.github.anrwatchdog.ANRError$$$_Thread: |ANR-WatchDog| (state = RUNNABLE)
at dalvik.system.VMStack.getThreadStackTrace(Native Method)
at java.lang.Thread.getStackTrace(Thread.java:580)
at java.lang.Thread.getAllStackTraces(Thread.java:522)
at com.github.anrwatchdog.ANRError.New(ANRError.java:72)
at com.github.anrwatchdog.ANRWatchDog.run(ANRWatchDog.java:209)
上面代码虚线就是报ANR异常的地方。