转载请注明出处:https://blog.csdn.net/weixin_42072033/article/details/109622923
大家好,今天给大家带来Android系统ANR错误实战分析。在开始之前请允许我说几句不相干的话。
我叫麻锦荣,你们叫我锦荣就好了,在深圳从接触Android到现在已经有7个年头了,从最早的ADT(那会儿还没有AS)开发app,到后来定制手机ROM,再到智能家居,智能硬件,车载产品,电视机,商显等Android开发工作,一路走来深感Android的发展迅速,对于Android程序员的要求也从APP开发提高到系统Framework层,机器学习,机器视觉等更广的领域。一路上,我碰到过无数的难题,相信以后也一样会碰到,但是互联网的知识共享给了我力量,成为了我前进道路上的好帮手。但是我却以工作太忙或者其他的借口,其实就是自己的懒散为由从来没有把自己开发中的心得分享给大家,共同学习,共同进步。这是我第一篇博客,很多表达或许词不达意,但是我相信万事开头难,以后一定会渐入佳境。
好了,废话就说这么多,下面开始进入今天的主题吧,相信看完这篇文章的你对ANR问题的解决又会更加充满信心。
Android开发中经常碰到一个叫做ANR(Application Not Responding)的问题,如果这个apk是你们自己开发的,报ANR,有经验的程序员自己肯定会较为容易的检查出代码哪里出了问题。好,那么问题来了,如果是原厂(MTK,全志,RK,amlogic等)系统报出ANR,我们怎么解决?下面就用我公司实际碰到的问题为例,为大家实战讲解。
相信大家都知道有个东西叫小部件Widget,我们手机上的时钟小部件可以选择大小,开机的时候加载到我们的桌面上显示时间。前几天公司发现一个bug,直接上图。
如图,时钟Widget一直显示正在加载,几分钟后依然不显示时间,抓取log,发现ANR错误,如下:
使用的板子和源码均为amlogic平台,Android版本为9.0 。 由于是编译完直接烧录,可以100%确定是由源码引起ANR,从log信息看,似乎是com.android.phone 这个应用包下的VvmSimStateTracker这个类引起的,那是这样么?我们找到这个类
可以看出,VvmSimStateTracker就是一个广播接收器,就是用来监听一些sim卡热插拔的工具类,从刚才的log中看,是由于开机广播的处理出现了问题导致ANR,好,那么我们把这个android.intent.action.BOOT_COMPLETED给它注释掉,编译,看下结果。结果发现竟然正常了,时钟部件开机5秒内正常显示时间。好多人有疑问了,为什么只是简单接收了一个开机广播,就报ANR了呢?我们又不是第一天接收它了,留个疑问在这里。
Android中,主线程(UI线程)如果在规定时内没有处理完相应工作,就会出现ANR。具