专栏名称: CSDN
CSDN精彩内容每日推荐。我们关注IT产品研发背后的那些人、技术和故事。
51好读  ›  专栏  ›  CSDN

15个句号导致微信 ANR,你中招了吗?附原理解析与解决方案

CSDN  · 公众号  · 科技媒体  · 2017-09-25 18:11

正文

点击上方“ CSDN ”,选择“置顶公众号”

关键时刻,第一时间送达!


近日,有网友表示,在微信中输入“两个数字+15/20 个中文字符的句号”(另一说法是任意数字,任意 15 个标点),部分 Android 手机发送或者收到该消息时,微信就会无响应。


案例 1:15。。。。。。。。。。。。。。。

案例 2:15。。。。。。。。。。。。。。。。。。。。


中招的手机


来自知乎的网友@口贝力 实测机型:


  • 小米 6:没问题(但将句号改为 20 个时,手机卡死);

  • 苹果:没问题;

  • mete 9:卡死;

  • 三星:卡死;

  • 360 手机:卡死。


效果图如下:



原理解析


CSDN 博客专家@三精-大精wing 对于导致微信 ANR 的根本原因进行了解析(以下为授权发布):


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


首先,微信发生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. (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()方法导致的。







请到「今天看啥」查看全文