Bug詳情:
描述:在頻繁切換某兩個(gè)功能的時(shí)候,一開(kāi)始沒(méi)有什么問(wèn)題,大概非澈昕瑁快速頻繁切換十幾分鐘(時(shí)間不確定羽嫡,有時(shí)候長(zhǎng),有時(shí)候短)后肩袍,頁(yè)面點(diǎn)擊沒(méi)有反應(yīng)杭棵,偶爾會(huì)出現(xiàn)UI呈現(xiàn)錯(cuò)亂或者顯示字符串文字顯示不全。但是服務(wù)端同步數(shù)據(jù)是能收到并沒(méi)有問(wèn)題氛赐。最后會(huì)出現(xiàn)ANR魂爪。
日志內(nèi)容:
1.App打印出的App未捕獲到的拋給系統(tǒng)的異常日志:
java.lang.IllegalStateException: View with id -1: android.widget.LinearLayout#onMeasure() did not set the measured dimension by calling setMeasuredDimension()
at android.view.View.measure(View.java:22083)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:687)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:687)
at adnroid.view.View.measure(View.java:22071)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
at adnroid.view.View.measure(View.java:22071)
at androidx.viewpager.widget.ViewPager.onMeasure(VIewPager.java:1638)
at packageName.CustomViewPager.onMeasure(CustomViewPager.java:49)
.......
2.系統(tǒng)里面的ANR日志的位置:
解決過(guò)程
1.首先找到源碼拋出這個(gè)異常的地方:
分析:
(1)開(kāi)始是以為自定義的CustomViewPager里面自定義的onMeasure方法里沒(méi)有調(diào)用setMeasureDimension(),于是查找到類(lèi)艰管,一看沒(méi)有重寫(xiě)onMeasure滓侍,查看繼承的ViewPager里面,在onMeasure里面肯定是調(diào)用了setMeasureDimension()牲芋。再查找了所有繼承onMeasure的自定義撩笆,都有調(diào)用setMeasureDimension(),于是排除了這個(gè)原因街图。
2.查看系統(tǒng)ANR的日志
并沒(méi)有找到最終定位到代碼異常的位置浇衬,全部都是系統(tǒng)的一些的代碼和.so庫(kù)。但是發(fā)現(xiàn)好些線(xiàn)程描述里面都有:(art::ConditionVariable::WaitHoldingLocks(art::Thread*)+88)類(lèi)似這種描述餐济,就以為是哪里出現(xiàn)了死鎖耘擂。于是仔細(xì)分析了一遍代碼,雖然不是鎖的原因造成的絮姆,但最后找到了造成Bug的代碼位置醉冤。(歡喜 -)
問(wèn)題原因:
在子線(xiàn)程去調(diào)用了控件的setBackground,本來(lái)這個(gè)方法只是改變自定義控件的屬性值篙悯,結(jié)果在添加新需求的時(shí)候不小心將設(shè)置背景放到了該方法里面蚁阳。
驗(yàn)證:
工具:
uwsc:一款自動(dòng)化工具,自動(dòng)運(yùn)行的Windows軟件鸽照。
使用形式:
1.記錄鼠標(biāo)和鍵盤(pán)的動(dòng)作并執(zhí)行相同的動(dòng)作
2.編寫(xiě)腳本
操作方法:
一螺捐、記錄:
1.雙擊UWSC.exe
2.點(diǎn)擊4號(hào)按鈕,開(kāi)始記錄電腦屏幕上的操作
3.使用2號(hào)按鈕保存矮燎,會(huì)保存一個(gè)類(lèi)似【記錄.UWS】的腳本
二定血、編寫(xiě)腳本:
Example:
for i = 0 to 1000
BTN(LEFT,CLICK,333,22,100) //左鍵點(diǎn)擊坐標(biāo)為333,22的位置,等待100ms
BTN(LEFT,CLICK,444,666,100)//左鍵點(diǎn)擊坐標(biāo)為444,666的位置诞外,等待100ms
Next
1.點(diǎn)擊按鈕1澜沟,選擇想要執(zhí)行的腳本打開(kāi)。
2.點(diǎn)擊按鈕3峡谊,開(kāi)始在屏幕執(zhí)行腳本茫虽。
3.停止:Alt+F2