关于Android ANR的思考

来源:互联网 发布:java语言程序设计下载 编辑:程序博客网 时间:2024/05/21 14:42
  最近在做一些App OEM 相关的工作,在Monkey 测试中,表现的不是很好,所以做了一些梳理工作。
  • Android ANR的原因。
  • Android ANR 的分类。
  • Android ANR 的排查。
  • Android ANR 的解决。

1 .Android ANR的原因

  ANR:Application Not Responding,即应用无响应。其实说句人话,就是在Main Thread 做了不该做的事情。就这个原因。   

2 . Android ANR的分类

ANR一般有三种类型:

  • KeyDispatchTimeout(5 seconds) –主要类型按键或触摸事件在特定时间内无响应

  • BroadcastTimeout(10 seconds) –BroadcastReceiver在特定时间内无法处理完成

  • ServiceTimeout(20 seconds) –小概率类型 Service在特定的时间内无法处理完成

3. Android ANR的排查

  ANR 一般排查会查看trace文件,但是trace文件包含的内容其实很有限。最应该看的日志是Logcat以及eventlog日志,原因很简单,Logcat日志无所不包,是最基本的日志文件。  步骤:    1. 找到ANR关键字(大写匹配)    2. 向上查找timeout关键字,这个时候能找到ANR的原因,如:                     Application  do  too  much work in main thread 等。    3. 查看trace 文件找出出现的最终原因。    给出一个具体的示范。
    package com.example.suj.anr;import android.support.v4.widget.TextViewCompat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import java.util.concurrent.TimeUnit;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    @Override    protected void onResume() {        super.onResume();//        try {//            Log.e("suj","start sleep");//            TimeUnit.SECONDS.sleep(12);//        } catch (InterruptedException e) {//            e.printStackTrace();//        }    }    private void init() {        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                while (true){                }            }            });    }}

大家可以很清晰的看到我写了一个死循环。
下面给出Logcat 的日志:
ANR时刻如下:
ANR 时刻
ANR原因如下:
原因如图
trace 文件如图:
trace文件
下一篇博客讲解非常规ANR的解决方法。

0 0