最近手頭分來(lái)了一個(gè)bug笆凌,該bug很詭吊,一行代碼的改動(dòng)士葫,花了四天時(shí)間乞而,因?yàn)樵揃ug會(huì)block出貨,項(xiàng)目經(jīng)理每天催問(wèn)進(jìn)度慢显,期間真是感覺(jué)整個(gè)人都不好了爪模。本篇博文記錄解決該問(wèn)題的坎坷歷程,因?yàn)榇a保密原則荚藻,技術(shù)細(xì)節(jié)不便詳細(xì)給出屋灌,重點(diǎn)記錄解決問(wèn)題的過(guò)程。
問(wèn)題描述
MTK平臺(tái)雙攝拍完的景深圖片在Gallery內(nèi)应狱,能進(jìn)行refocus(重聚焦)操作共郭,Camera近期新增拍攝4:3比例的圖片,refocus時(shí)該種比例的圖片顯示會(huì)拉伸,為了解決該問(wèn)題除嘹,我對(duì)refocus后的圖片進(jìn)行了一個(gè)resize操作写半。之后就報(bào)出對(duì)該種圖片進(jìn)行refocus操作,非常高的概率出現(xiàn)點(diǎn)擊兩次才能正確改變圖片焦點(diǎn)的bug尉咕。16:9的圖片則沒(méi)有該Bug〉現(xiàn)象如圖-1.
而正常的現(xiàn)象應(yīng)該點(diǎn)擊哪里,哪里就清晰年缎。如圖-2.
解決過(guò)程
Day-1:自我懷疑
問(wèn)題是在我的修改之后才引發(fā)的悔捶,因此這個(gè)漏洞還得我來(lái)補(bǔ),回退掉resize的改動(dòng)单芜,該問(wèn)題確實(shí)消失了蜕该,但圖片會(huì)被拉伸的問(wèn)題當(dāng)然又會(huì)出來(lái),看來(lái)我得找其他方法修正圖片拉伸的問(wèn)題洲鸠,此時(shí)項(xiàng)目經(jīng)理發(fā)出郵件堂淡,強(qiáng)調(diào)該問(wèn)題會(huì)block產(chǎn)品出貨,讓盡快處理坛怪。頂著壓力開(kāi)始擼一遍代碼淤齐,梳理了下Refocus的大體過(guò)程:
因?yàn)閱?wèn)題只出現(xiàn)在4:3比例的圖片上股囊,一開(kāi)始就認(rèn)為問(wèn)題出在A過(guò)程中袜匿,猜測(cè)4:3比例的圖片接收的touch坐標(biāo)與圖片上的坐標(biāo)點(diǎn)沒(méi)有正確對(duì)應(yīng)。排查代碼稚疹,發(fā)現(xiàn)底層算法邏輯是按16:9的圖片比例處理景深數(shù)據(jù),到此以為找到了root cause,連同圖片會(huì)被拉伸的問(wèn)題一并拋給平臺(tái)居灯,讓他們?nèi)ソ狻?br> 因?yàn)槭瞧脚_(tái)提供的算法問(wèn)題,而算法核心邏輯平臺(tái)是以庫(kù)文件release出來(lái)内狗,我們無(wú)法修改怪嫌。問(wèn)題也拋給了平臺(tái),我這邊沒(méi)有壓力柳沙,只用等平臺(tái)提供修復(fù)patch過(guò)來(lái)合并就可岩灭。然而等待一段時(shí)間后,平臺(tái)給了反饋赂鲤,我之前為解決圖片拉伸引入的resize patch修改方案是可行的噪径,他們修正拉伸問(wèn)題的改法與我的一樣,重點(diǎn)是加上resize的patch該問(wèn)題在平臺(tái)的Gallery上沒(méi)法復(fù)現(xiàn)数初,這無(wú)疑將問(wèn)題拋回給了我找爱。壓力指數(shù)立馬暴增十幾個(gè)點(diǎn),如果平臺(tái)沒(méi)有問(wèn)題泡孩,那就只可能是我在porting平臺(tái)gallery的時(shí)候出錯(cuò)了车摄。這里說(shuō)明下項(xiàng)目采用的gallery并不是基于平臺(tái)Gallery開(kāi)發(fā)的,只是將平臺(tái)gallery上的refocus相關(guān)代碼porting進(jìn)來(lái)。如果porting過(guò)來(lái)的代碼產(chǎn)生bug吮播。就有兩種可能:
- 平臺(tái)gallery問(wèn)題
- porting過(guò)程中引入的問(wèn)題
真出問(wèn)題了变屁,當(dāng)然希望是第一類(lèi)問(wèn)題,這樣最起碼還能求助平臺(tái)薄料,如果是porting不當(dāng)引發(fā)的問(wèn)題敞贡,平臺(tái)頂多協(xié)助分析下,還得自己去一點(diǎn)點(diǎn)嚼回頭草摄职,現(xiàn)在如果平臺(tái)沒(méi)能復(fù)現(xiàn)問(wèn)題誊役,那么整個(gè)壓力就又跑到我這邊來(lái)了。
于是趕緊更新平臺(tái)的Gallery代碼谷市,安裝后測(cè)試蛔垢,我擦,明顯能復(fù)現(xiàn)啊迫悠。這是怎么回事呢鹏漆?又重新拿平臺(tái)的gallery復(fù)測(cè)了幾遍,確實(shí)平臺(tái)gallery也有該問(wèn)題创泄。于是下班前再次把現(xiàn)象發(fā)郵件給平臺(tái)艺玲,這時(shí)距離項(xiàng)目經(jīng)理發(fā)出郵件已經(jīng)過(guò)去了一天。
Day-1后記
不夠自信鞠抑,浪費(fèi)了很多時(shí)間復(fù)測(cè)平臺(tái)gallery的現(xiàn)象饭聚,由于平臺(tái)反饋他們加入resize patch都沒(méi)能復(fù)現(xiàn)問(wèn)題,因此就懷疑自己向平臺(tái)加入resize的patch不正確搁拙,檢查了好幾遍代碼秒梳,在加上編譯安裝測(cè)試,浪費(fèi)了時(shí)間箕速。過(guò)度的細(xì)心酪碘,浪費(fèi)時(shí)間,拖慢了進(jìn)度盐茎。
Day-2:逃避
發(fā)送給平臺(tái)的郵件得到回復(fù)兴垦,平臺(tái)依然無(wú)法復(fù)現(xiàn)問(wèn)題,問(wèn)題陷入羅生門(mén)字柠。我用平臺(tái)的Gallery能復(fù)現(xiàn)問(wèn)題探越,但平臺(tái)卻又無(wú)法復(fù)現(xiàn)。于是又梳理了幾個(gè)可能導(dǎo)致結(jié)果不同的可疑點(diǎn)募谎。
- 復(fù)現(xiàn)問(wèn)題的圖片扶关。因?yàn)閞efocus采用的圖片依賴Camera拍攝,會(huì)不會(huì)平臺(tái)復(fù)現(xiàn)問(wèn)題時(shí)所用的圖片和我們不一致導(dǎo)致的呢数冬。郵件將我復(fù)現(xiàn)用的圖片發(fā)送給平臺(tái)方节槐,得知依然無(wú)法復(fù)現(xiàn)搀庶。
- 我加入的resize patch與平臺(tái)不同。郵件將我的改動(dòng)發(fā)送給平臺(tái)方铜异,經(jīng)確認(rèn)修改地方一致哥倔。
- porting時(shí)出錯(cuò)。郵件將porting過(guò)來(lái)的refocus相關(guān)文件發(fā)送給平臺(tái)方揍庄,幫忙確認(rèn)porting是否有問(wèn)題咆蒿,經(jīng)確認(rèn)porting無(wú)誤。
- 郵件發(fā)送log給平臺(tái)蚂子,請(qǐng)其嘗試從log排查是否有問(wèn)題沃测。自己和平臺(tái)都未看出問(wèn)題。
問(wèn)題至此感覺(jué)無(wú)法進(jìn)展下去了食茎,平臺(tái)無(wú)法復(fù)現(xiàn)問(wèn)題蒂破,也就沒(méi)法給出解決方案。自己轉(zhuǎn)向去解決其他bug别渔。該問(wèn)題處于擱置狀態(tài)附迷。這時(shí)距離項(xiàng)目經(jīng)理發(fā)出郵件過(guò)去了兩天。
Day-2后記
1.溝通不暢哎媚,當(dāng)自己這邊復(fù)測(cè)后現(xiàn)象與平臺(tái)方不一致喇伯,應(yīng)該及時(shí)溝通,這一點(diǎn)在Day-3中通過(guò)項(xiàng)目經(jīng)理的推動(dòng)才加緊了溝通步伐拨与。
2.沒(méi)有從正面解決問(wèn)題稻据。一直圍繞問(wèn)題周邊在排查,本來(lái)期望這樣能快速定位問(wèn)題截珍,但沒(méi)能第一時(shí)間再次詳細(xì)梳理代碼邏輯攀甚。
3.惰性產(chǎn)生箩朴。頭疼的bug沒(méi)有一點(diǎn)頭緒后岗喉,產(chǎn)生懈怠心理。擱置的問(wèn)題永遠(yuǎn)是問(wèn)題炸庞,出現(xiàn)了要正面解決钱床。
Day-3:找到原因
項(xiàng)目經(jīng)理開(kāi)始不斷催促問(wèn)題進(jìn)度。但自己仍舊沒(méi)有頭緒埠居,壓力指數(shù)再次攀升查牌。項(xiàng)目經(jīng)理催促直接電話跟平臺(tái)溝通,要加強(qiáng)push平臺(tái)滥壕。自己通過(guò)其他渠道拿到平臺(tái)電話纸颜,直接電話溝通。果然電話溝通后很有收獲绎橘,知道了一種debug方法胁孙,能查看點(diǎn)擊后通過(guò)算法邏輯生成的新Bitmap,趕緊本地debug唠倦,這時(shí)發(fā)現(xiàn)算法邏輯的圖片是正常的,也就是圖-1中的A步驟執(zhí)行完成后涮较,結(jié)果是正確的稠鼻,問(wèn)題出在B步驟上】衿保總算有了明確的分析方向候齿。
A步驟完成后,refocusview將新生成的bitmap上圖闺属,跟平臺(tái)方確認(rèn)上圖的邏輯調(diào)用是正確的慌盯。看著快要找到問(wèn)題原因了掂器,但還是進(jìn)行不下去润匙,相同的邏輯,運(yùn)行的結(jié)果確不一樣唉匾。詭吊的很孕讳。
在次從touch事件開(kāi)始梳理代碼,由于refocus的父類(lèi)封裝在庫(kù)文件里巍膘,這也給排查代碼邏輯帶來(lái)了復(fù)雜性厂财。硬著頭皮分析出OnTouch主要做了兩件事:
- mRefocusListener.setRefocusImage(mDownRX, mDownRY)。通過(guò)接口回調(diào)的方式將touch坐標(biāo)回傳給Activity峡懈,Activity利用點(diǎn)擊坐標(biāo)生成新的焦點(diǎn)圖璃饱。
-
requestRender()。方法實(shí)現(xiàn)無(wú)法看到肪康,從名字猜測(cè)像是GLSurfaceView里調(diào)用它來(lái)渲染圖片荚恶,重聚焦的過(guò)程伴隨一個(gè)過(guò)度動(dòng)畫(huà),有可能就是通過(guò)它不斷渲染做出來(lái)的效果磷支。
心里大概對(duì)這個(gè)過(guò)程有個(gè)一個(gè)猜測(cè)圖谒撼。
繼續(xù)與平臺(tái)溝通,確認(rèn)上述猜測(cè)正確雾狈。那這里就有個(gè)坑了廓潜,如果渲染動(dòng)畫(huà)結(jié)束后,生成的新圖才被交給refocusview善榛,那當(dāng)然不會(huì)被更新上來(lái)辩蛋。
如果上面的流程正確,已經(jīng)大概猜測(cè)到為何添加resize的patch后就會(huì)出現(xiàn)該Bug移盆。但還是無(wú)法解釋為何平臺(tái)一次都沒(méi)有復(fù)現(xiàn)該問(wèn)題悼院。
突然想起來(lái)我們的手機(jī)是將大核關(guān)閉的,那么有可能機(jī)器性能不如平臺(tái)方咒循,導(dǎo)致生成新圖的過(guò)程太長(zhǎng)了据途。
趕緊實(shí)驗(yàn)钮呀。用命令:
adb shell cat /proc/ppm/mode
查看到當(dāng)前手機(jī)處于低功耗模式。
用命令:
echo Performance > /proc/ppm/mode
開(kāi)啟高性能模式昨凡。
在復(fù)測(cè)問(wèn)題爽醋,神奇的事情發(fā)生了,bug沒(méi)有了便脊,完美蚂四!
這時(shí)距離項(xiàng)目經(jīng)理發(fā)出郵件過(guò)去了三天。
Day-4:改了一行代碼
已經(jīng)找到問(wèn)題原因哪痰。之前的疑惑也有了合理的解釋遂赠。
- 為何平臺(tái)沒(méi)有復(fù)現(xiàn)問(wèn)題?平臺(tái)設(shè)備沒(méi)有關(guān)閉大核晌杰,生成新圖的過(guò)程很快跷睦,動(dòng)畫(huà)結(jié)束之前,新圖已經(jīng)成功傳給refocusview肋演。
- 為什么加入resize操作問(wèn)題就報(bào)出來(lái)了抑诸?resize對(duì)新圖進(jìn)行了縮放,這個(gè)過(guò)程耗時(shí)爹殊,導(dǎo)致動(dòng)畫(huà)完成后蜕乡,新圖才傳給refocusview。
- 為什么是4:3比例的圖片才有這個(gè)問(wèn)題梗夸?4:3圖片大层玲,生成新圖的過(guò)程相對(duì)其他圖片耗時(shí)長(zhǎng)。
那么有幾個(gè)方面可以修復(fù)該問(wèn)題反症。
- 優(yōu)化算法辛块,縮短生成新圖時(shí)間。這需要平臺(tái)去改铅碍,難度大润绵,推動(dòng)也難。直接pass该酗。
- 更改refocusview刷新機(jī)制授药,就算動(dòng)畫(huà)結(jié)束前士嚎,新圖沒(méi)能生成呜魄,也應(yīng)該提供二次刷新的機(jī)會(huì)。該改動(dòng)較大莱衩,在出貨階段爵嗅,萬(wàn)一引入新的bug,更頭疼笨蚁。但這應(yīng)該是該問(wèn)題最正確的解法睹晒。
- 將gallery加入高性能白名單趟庄,需要Performance組協(xié)助配置。但因?yàn)檫@一個(gè)問(wèn)題伪很,將其配置進(jìn)白名單戚啥,有點(diǎn)小提大作。
- 動(dòng)態(tài)配置CUP頻率锉试,在生成新圖的過(guò)程中對(duì)CUP升頻猫十。
- 偷機(jī)取巧,拉長(zhǎng)動(dòng)畫(huà)時(shí)間呆盖。只需變更一個(gè)值拖云,風(fēng)險(xiǎn)低。但沒(méi)能從正面解決应又。