为什么“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

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

ym——Android从零开始(15)(Activity启动模式、ANR异常、Handler)(新)

Activity启动模式任务堆栈 Activity中的任务是与用户交互的一组Activity的集合,Activity会被按打开顺序安排在一个堆栈里。 任务栈:并不是Activity是Activit...

WAP调用微信支付https://pay.weixin.qq.com/wiki/doc/api/wap.php?chapter=15_1

网页调用微信支付(WabView 调用微信支付)

Java微信二次开发之15-自定义菜单的类型

距离写上一篇文章《自定义菜单的创建及菜单事件响应》整整过了两个月的时间,那时公众平台还没有开放view类型的菜单。在不久前,微信公众平台悄悄开放了view类型的菜单,却没有在首页发布任何通知,貌似微信...
  • LanBuff
  • LanBuff
  • 2016年09月06日 15:47
  • 1403

懂商业的技术合伙人(15):微信小程序

微信小程序,是一种介于Web和App之间的应用程序。 雷观:微信小程序和微信公众号,都可以作为早期创业的切入点。...

微信app和硬件蓝牙设备通信交互通道(15)

文章来源 V型知识库 http://www.vxzsk.com/282.html 好多初学者刚接触微信硬件的时候不知道微信app和蓝牙设备是如何通信的,也就是互相通信交互数据的,那么本章节就单独...

2017-01-15 微信小程序胡诌一

2017年1月9日,正值iphone发布10周年,在2007年的1月9日,乔布斯发布了震惊世界的iphone,10年后张小龙正式推出了他的小程序,究竟何意也没有具体深究。最初的时候小程序并不叫小程序,...

Android5.0L因SystemUI ANR导致的黑屏问题分析

一、问题现象1、用户直观看到的现象是黑屏。2、出问题时StatusBar、NavigationBar和墙纸消失。3、大部分发生在FOTA重启之后,出现概率很低。Platform:MSM8916Andr...

通过计算ListView的高度导致ListView失去它原有回收机制,同时造成ANR

前言:    由于ScrollView和ListView共存的时候,由于项目中是用的自定义的ListView,通过又不能更换ListView,只能用公司框架的,所以我是通过计算ListView每个It...

关于调用频繁调用MediaPlayer播放音乐导致ANR的解决办法

本来想建一个demo工程上传到git上面,但是由于只是简单的2个类,想想还是算了吧。 这次分为播放手机自身音乐以及播放网络音乐的处理办法。有想测试的可以拷贝进去搞一个RecyclerView里面弄一...

android应用程序中对于ANR主线程超时不响应导致强制关闭的解决方案

ANR(Application Not Responding)定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Ap...
  • yuanyl
  • yuanyl
  • 2016年03月11日 14:50
  • 1447
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:为什么“15。。。”会导致微信ANR?
举报原因:
原因补充:

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