logo
当前位置:首 页 > 杂侃 > 查看文章

有网友反映称,微信出现了新的bug。例如,在微信中发“两位数字+15个句号”(另一说法是任意数字,任意15个标点符号),如果有华为手机或者安卓手机收到,就会卡死。

用安卓手机的朋友可以试一下,不过我估计你要是群发了你所有的微信好友,我可不确定你能见到明天的太阳!

据网友爆料称,之所以出现这种状况是“发送任意两位数字+15个句号”会触发过滤器的Bug导致内存泄漏,这时候发消息和读取消息的人手机都会卡死,为此我特意尝试了以下,发现只要用电脑的客户端和iOS客户端都不会有问题,只有安卓有问题。

至于解决方法就是重启微信然后删除那个聊天记录就好了!

就目前位置,微信官方还有没给出具体的回复。不过这样一看,这个bug还挺好玩的,你讨厌谁就一直给他发“两位数字+15个句号”就好了啊!

原理解析

CSDN 博客专家@三精-大精wing 对于导致微信 ANR 的根本原因进行了解析

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

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

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

其中有这么一段:

发现是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里了。

解决方案

方案一

  • 已发布的此类消息,及时撤回;
  • 过几分钟重新打开微信,删除聊天记录(想要尝试者务必提前备份好聊天记录),重新打开即可。

方案二

  • 作为安卓党,不要损友、损自己,不要轻易去尝试,忍住!!!

方案三

  • 据微信 Android 的小伙伴表示,这个 Bug 已经在 Patch 了。
一个有大大梦想但是没有支撑这梦想的技术的攻城狮,大家就当这个博客是你的技术工具箱吧,我会吧我工作中遇到的问题贴在这,大家需要的记得把我放到收藏夹哦! 百度输入“子傲代码”就可以了

—— 陈子傲

admin
众说纷纭Comments
大眼 可爱 大笑 坏笑 害羞 发怒 折磨 快哭了 大哭 白眼 晕 流汗 困 腼腆 惊讶 憨笑 色 得意 骷髅 囧 睡觉 眨眼 亲亲 疑问 闭嘴 难过 淡定 抗议 鄙视 猪头
小提示:直接粘贴图片到输入框试试
努力发送中...
  • 评论最多
  • 最新评论
  • 随机文章
footer logo
未经许可请勿自行使用、转载、修改、复制、发行、出售、发表或以其它方式利用本网站之内容
Copyright ©ziao design Studio All Rights Reserved.沪ICP备14052271号-3