检测ANR

检测方式

线上环境的ANR错误需要我们及时的上报服务器,那么如何主动检测ANR错误呢?

1、FileObserver

当发生ANR的时候,我们查看控制台的日志

07-27 10:25:09.732 23995-24002/com.qunar.yuzhiyun.anr I/dalvikvm: threadid=3: reacting to signal 3
07-27 10:25:09.792 23995-24002/com.qunar.yuzhiyun.anr I/dalvikvm: Wrote stack traces to '/data/anr/traces.txt'

可以看出,发生ANR,进程会收到信号3,紧接着开始向’/data/anr/traces.txt’ 文件写 栈跟踪信息,这样的话,我们只需要通过FileObserver 来监控’/data/anr/traces.txt’ 文件的变化不就行了吗?只要有变化就说明发生了ANR(据笔者所知,暂时没有其他引起traces.txt变化的原因)。但是FileObserver在5.0及以上系统部分机型失效,所以不算好的方法。

2、watchDog方式

有人提出watchDog方式的检测方法,在主线程定义一个变量count,在子线程不断的通知主线程去更新count的值(比如+=1),子线程维护一个值与count相等的变量,睡眠5秒后去判断两个值是否相等,从而判断是否出现了ANR错误,以下代码简单的给出了示范。(读者在运行这段代码的时候,先点击FloatingActionButton 让主线程长时间睡眠,然后再操作一下界面的其他元素,就可以在控制台看到Log.e(“Thread”,”ANR happpened”); 打印的日志啦)

public class MainActivity extends AppCompatActivity {

    Handler handler=new Handler();
    int count;
    private final Runnable message= new Runnable() {
        @Override public void run() {
            count= (count+ 1) % 10;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);


        new Thread(){
            @Override
            public void run() {
                int lastCount;
                while(true) {
                    lastCount =  count;
                    handler.post(message);
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    if(count == lastCount) {
                        //检测到了ANR
                        Log.e("Thread","ANR happpened");
                    }
                }
            }
        }.start();
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    try {
                        Log.i("Thread","start sleep");
                        Thread.sleep(1000000000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
            }
        });
    }


}

参考

http://mobnav.dev.qunar.com/2016/08/29/anr_monitor_analysis/

http://mobnav.dev.qunar.com/2015/11/12/android-anr-monitor/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值