微信ANR原理解析與解決方案
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評(píng)論(0)
原理解析
CSDN 博客專家@三精-大精wing 對(duì)于導(dǎo)致微信 ANR 的根本原因進(jìn)行了解析(以下為授權(quán)發(fā)布):
本文目的在于學(xué)習(xí)研究Android技術(shù),若有侵犯,聯(lián)系作者將及時(shí)刪除。
首先,微信發(fā)生ANR以后,會(huì)生成traces.txt文件。通過adb 導(dǎo)出
adb pull /data/anr/traces.txt ~/
其中有這么一段:
native: #05 pc 0043a419 /data/dalvik-cache/arm/system@framewor[email protected] (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)
發(fā)現(xiàn)是cellTextView鎖在了celltextView正則的時(shí)候。
于是乎debug celltextview包的a類的o方法,
發(fā)現(xiàn)一段超級(jí)復(fù)雜的正則(部分位置打碼),所以初步斷定為可能是正則時(shí)間太長(zhǎng)導(dǎo)致。于是寫了一個(gè)單元測(cè)試,來(lái)測(cè)試該正則是否有問題。
實(shí)驗(yàn)發(fā)現(xiàn),這個(gè)正則根本不會(huì)導(dǎo)致耗時(shí)過長(zhǎng),平均耗時(shí)0-1ms。
那也就是說明,其實(shí)不是這里的原因。
于是將斷點(diǎn)打靠上層,到 com.tencent.mm.ui.widget.celltextview.f.b.a() 方法上
點(diǎn)擊放過按鈕發(fā)現(xiàn)程序無(wú)限次落到這個(gè)斷點(diǎn)上,由此可知,是造成了死循環(huán),無(wú)限調(diào)用a()方法導(dǎo)致的。
繼續(xù)深究,為什么會(huì)導(dǎo)致死循環(huán)。
線索1:
發(fā)現(xiàn)a()方法上面有一個(gè)判斷,會(huì)導(dǎo)致跳到cond_6最終會(huì)繼續(xù)跳到goto_4調(diào)用a()方法。
這里有個(gè)
add-int/lit8 v4, v4, -0x1
其實(shí)他相當(dāng)于
i-1
線索2
觀察a()方法后面,有wwk,width等屬性調(diào)用。
結(jié)合線索
非常好我支持^.^
(0) 0%
不好我反對(duì)
(0) 0%
下載地址
微信ANR原理解析與解決方案下載
相關(guān)電子資料下載
- Safran與安立Anritsu合作推出C-V2X PC5通信功能驗(yàn)證方案 161
- 虹科Safran與安立Anritsu合作推出C-V2X PC5通信功能驗(yàn)證方案 157
- BERTWave MP2100B Anritsu安立眼圖儀的應(yīng)用 91
- Anritsu BERTWave? MP2100B眼圖誤碼儀示波器簡(jiǎn)介 137
- Anritsu MS2722C頻譜儀9kHz-9GHz 151
- Anritsu MS2711D/MS2711E頻譜分析儀 115
- Anritsu S331D電纜天線分析儀 106
- Anritsu S331D天饋測(cè)試儀 97
- Anritsu MT8000A綜合測(cè)試儀 124
- Anritsu MT8852B藍(lán)牙測(cè)試儀技術(shù)支持 100