为什么“15。。。”会导致微信ANR?

原创 2017年09月25日 17:31:47

本文目的在于学习研究Android技术,若有侵犯,联系作者将及时删除。

本文同步自wing的地方酒馆

首先,微信发生ANR以后,会生成traces.txt文件。通过adb 导出

adb pull /data/anr/traces.txt ~/ 

其中有这么一段:

native: #05 pc 0043a419  /data/dalvik-cache/arm/system@framework@boot.oat (Java_java_util_regex_Matcher_setInputImpl__JLjava_lang_String_2II+132)
  at java.util.regex.Matcher.setInputImpl(Native method)
  at java.util.regex.Matcher.resetForInput(Matcher.java:252)
  - locked <0x0ecefa84> (a java.util.regex.Matcher)
  at java.util.regex.Matcher.reset(Matcher.java:208)
  at java.util.regex.Matcher.reset(Matcher.java:177)
  at java.util.regex.Matcher.<init>(Matcher.java:90)
  at java.util.regex.Pattern.matcher(Pattern.java:297)
  at com.tencent.mm.ui.widget.celltextview.g.a.o(SourceFile:95)
  at com.tencent.mm.ui.widget.celltextview.g.a.dc(SourceFile:55)
  at com.tencent.mm.ui.widget.celltextview.f.b.a(SourceFile:76)
  at com.tencent.mm.ui.widget.celltextview.d.a.Cw(SourceFile:466)
  at com.tencent.mm.ui.widget.celltextview.d.a.Cp(SourceFile:92)
  at com.tencent.mm.ui.widget.celltextview.CellTextView.onMeasure(SourceFile:102)
  at android.view.View.measure(View.java:18794)
  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
  at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
  at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
  at android.view.View.measure(View.java:18794)

发现是cellTextView锁在了celltextView正则的时候。

于是乎debug celltextview包的a类的o方法,

发现一段超级复杂的正则(部分位置打码),所以初步断定为可能是正则时间太长导致。于是写了一个单元测试,来测试该正则是否有问题。

实验发现,这个正则根本不会导致耗时过长,平均耗时0-1ms。

那也就是说明,其实不是这里的原因。

于是将断点打靠上层,到 com.tencent.mm.ui.widget.celltextview.f.b.a() 方法上

点击放过按钮发现程序无限次落到这个断点上,由此可知,是造成了死循环,无限调用a()方法导致的。

继续深究,为什么会导致死循环。

线索1:

发现a()方法上面有一个判断,会导致跳到cond_6最终会继续跳到goto_4调用a()方法。

这里有个

add-int/lit8 v4, v4, -0x1

其实他相当于

i-1

线索2

观察a()方法后面,有wwk,width等属性调用。

结合线索

接下来,打开jadx,将class文件反编译为java文件,利用线索快速定位代码。发现这些逻辑代码片段如下:

有了java代码,一下子就和蔼可亲了,来屡一下这段的逻辑。

可以看到有两个while循环,这里不关心外部while,因为可以看出真正卡死的是在内部while循环。

内部while循环首先判断了dVar2 是否为空,以及dVar2的text是否为空。

debug发现,dVar2是一个TextPaint类,用于绘制文本信息(包括字号,大小,颜色,超链接样式之类的)。

也就是说,只要dVar2不为空,这个循环就不会退出,根据代码可以看出,只有在i4>0的时候才可能把dVar2置为空:

那么i4是什么呢,在红框上面可以看到,i4是a的wwk属性。这个值暂时不知道是什么。

不过通过debug发现,这个wwk是始终等于0的,也就是不满足while内部的dVar2的置空条件,也就造成了while死循环。

于是乎,造成anr的最根本原因就是在这个while里了。

欢迎加入qq群讨论Android技术:
425983695

版权声明:本文为博主原创文章,欢迎注明出处后转载。

安卓网络编程1--ANR异常和Handler机制

网络编程之ANR异常和Handler机制
  • leeziyuan
  • leeziyuan
  • 2015年11月08日 23:42
  • 618

关于Activity back 无响应提示ANR 与onStop,onDestory不执行的问题

最近写项目,遇到一个特蛋疼的问题,先记录下,哪位大牛知道原因,还请指导下。 案例场景: app呼叫,提交http请求到后台,后台回拨电话下来,服务里面自动接听,不显示系统通话界面,app界面显示通话时...
  • luohaowang320
  • luohaowang320
  • 2014年01月10日 18:01
  • 1769

关于ANR线程阻塞那些坑

上次就是由于网关在点击一个ListView OnItemClick事件的时候 直接报ANR相信各位老司机也很清楚 就是说Android 当你点击某个组件五秒没有反应直接就ANR异常导致程序崩溃 那么...
  • qq_15950325
  • qq_15950325
  • 2017年09月04日 09:08
  • 146

android什么情况下会导致ANR?

粗略的来分会有两种情况导致ANR: 第一类:dispatchTimeout 输入事件分发超时,一般是由于主线程在5秒之内没有响应输入事件。 第二类:BroadcastReceive...
  • woaiheima
  • woaiheima
  • 2017年03月14日 10:47
  • 957

Android ANR出现原因

如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框,用户可以选择等待让程序继续运行,也可以选择强制关闭。 Android系统会监控程序的响应状况,如果应用(activity)在...
  • Beixiaozhang
  • Beixiaozhang
  • 2016年10月29日 14:47
  • 588

Handler机制 与 ANR异常

Handler是线程间通讯的机制,Android中,网络访问、文件处理等耗时操作必须放到子线程中去执行,否则将会造成ANR异常。ANR异常:Application Not Response 应用程序无...
  • q9104422999
  • q9104422999
  • 2016年08月05日 20:04
  • 830

安卓广播使用时的ANR问题,onReceive的生命周期为10秒

在 Android中,程序的响应(Responsive)被活动管理器(Activity Manager)和窗口管理器(Window Manager)这两个系统服务所监视,当BroadcastRec...
  • Me_Dong
  • Me_Dong
  • 2016年12月12日 14:06
  • 1606

android开发之详解ANR与OOM

懒惰,只是为了更好的懒惰!
  • zz1175854992
  • zz1175854992
  • 2015年04月01日 16:56
  • 2476

避免Android开发中的ANR

原文地址::http://log4think.com/avoid_anr_in_android/ 相关网帖:: 1.Android ANR keyDispatchingTimedOut Error...
  • lizzywu
  • lizzywu
  • 2013年12月06日 21:09
  • 3006

Android应用开发中草率使用synchronized同步关键字的隐患

Android应用中,对于很多类似XXXManager的业务逻辑类,很多都用单例模式。好处很多,比如保持数据的原子性和一致性。同时,往往存在主线程和各种工作线程,需要保证单例中的很多业务逻辑达到线程安...
  • aliankg
  • aliankg
  • 2016年01月26日 12:32
  • 981
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么“15。。。”会导致微信ANR?
举报原因:
原因补充:

(最多只允许输入30个字)