您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>源码下载>通讯/手机编程>

微信ANR原理解析与解决方案

大小:0.3 MB 人气: 2017-09-26 需要积分:1

  原理解析

  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.《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方法,

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

  微信ANR原理解析与解决方案

  实验发现,这个正则根本不会导致耗时过长,平均耗时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等属性调用。

  微信ANR原理解析与解决方案

  结合线索

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!