本文目的在于学习研究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

为什么“15。。。”会导致微信ANR?相关推荐

  1. 处理ERP的EXCEL报表数字长度超15位导致精度丢失的问题

    ERP的报表,输出格式是EXCEL的,经常会出现数字长度超15位导致精度丢失的问题. 目前发现的解决办法有2个. 方法1:可以将报表改为XML标准开发,就是产生XML,再开发一个Template的方式 ...

  2. Android 解决 SharedPreferences 导致的ANR问题

    背景 APM平台在上线 ANR 监控平台后,线上收集到了较多的ANR日志 ,从火焰图信息上看,函数阻塞在了QueuedWork 相关函数上 ,本文主要介绍的这一现象的原因以及如何解决这一问题. 本文介 ...

  3. Qt-QClipboard图片拷贝到微信导致微信很卡的问题

    导致微信很卡的写法 QClipboard *board = QApplication::clipboard(); QString testFile = "C://Users//bairuta ...

  4. ipv4ipv6导致微信H5支付问题

    问题背景: 微信APP支付需要与包名.签名绑定,因此客户端使用微信H5支付,可以避开大量马甲包支付问题 使用微信H5支付偶尔会出去以下问题: 意思是说在支付过程中,用户的ip有变动,从而导致支付失败! ...

  5. 微信二次修改微信号_微信号怎么改第二次?微信7.0.15版本改微信号方法解析

    微信7.0.15版本是最近出来的一个版本,可以修改微信号,赢得了很多用户的关注,那么具体的修改方法是什么?下面就是对相关内容的介绍,感兴趣的话可以一起来了解下. 微信支持修改微信号操作流程 在7.0. ...

  6. Android 线程死锁导致的ANR问题分析

    最近遇到一个系统引起的ANR问题,遇到的时候特别懵,首先我取出了日志文件,由于网上分析ANR的例子比较少,无法找到参考,所以只能硬上了 在/data/anr/目录下的trace文件 ANR文件 下面是 ...

  7. 服务器换IP地址导致微信第三方服务失效

    昨晚10点,服务器更改了IP地址,同时也更新了域名的DNS解析.其他应用均正常.但在更新了微信开放平台中的第三方平台项目的白名单IP地址列表后,微信官网仍然不能每隔10分钟推送component_ve ...

  8. ABP入门系列(15)——创建微信公众号模块

    1. 引言 现在的互联网已不在仅仅局限于网页应用,IOS.Android.平板.智能家居等平台正如火如荼的迅速发展,移动应用的需求也空前旺盛.所有的互联网公司都不想错过这一次移动浪潮,布局移动市场分一 ...

  9. 关于vue路由模式导致微信jssdk授权问题的正确解决姿势

    如何正确解决vue路由模式weixin-jssdk授权问题 第一种情况:最常用的history模式 第二种也比较常用,hash模式 第三种就是memoryHistory 总结 第一种情况:最常用的hi ...

最新文章

  1. 【AJAX】DWR入门教程
  2. netcore mvc快速开发系统(菜单,角色,权限[精确到按钮])开源
  3. jzoj4227-B【dp,字符串】
  4. flyway版本号_Flyway版本化管理数据库脚本
  5. 学习C++,知识点太多记不住怎么办?
  6. Linq 入门系列 [Take,Skip,TakeWhile,SkipWhile]篇
  7. 【BERT实践】看不懂bert没关系,用起来so easy!
  8. 创建线程的3种方式,线程池的参数详解
  9. 解决ios手机页面overflow scroll滑动很卡的问题
  10. 高等代数第3版下 [丘维声 著] 2015年版_义务教育数学课程标准(2011年版)(部分内容)...
  11. @guardedby同步注解
  12. Ubuntu kylin优麒麟下配置Hadoop环境
  13. H5接入支付流程-微信支付支付宝支付
  14. 制作一个简单的轮播图(详解新手教学)
  15. 图像分割算法实现(matlab/python)
  16. 照片怎么压缩变小?如何把照片压缩到20K?
  17. Nginx-正向代理HTTPS
  18. 岁月蹉跎,人生几何。
  19. 公司-便利蜂:便利蜂
  20. ActiveMQ在windows上的下载安装与配置

热门文章

  1. flask 配置文件
  2. VGG - Very Deep Convolutional Networks for Large-Scale Image Recognition
  3. 【tensorboard】从tensorboard上看出模型是否存在过拟合
  4. javascript 水平文字垂直滚动
  5. vmware虚拟机ubuntu开机黑屏问题解决
  6. screen史上最全教程
  7. argis怎么关掉对象捕捉_你和你的网恋对象,都怎么样了?
  8. nacos 负载策略_Spring Cloud Alibaba:Nacos 作为注册中心和配置中心使用
  9. Rabbit-用户上线接收消息
  10. c语言pushback用法,C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack...