前言
現(xiàn)在的安卓碎片化其實(shí)挺嚴(yán)重货邓,由于是開源的系統(tǒng)栏笆,每個(gè)手機(jī)廠商都有自己的Rom准验。每個(gè)廠商的適配對于我這種苦逼的初級菜鳥安卓開發(fā)程序員是一大難題扔水。但是今天講的并不是適配的話題饱狂,哈哈哈曹步,那么我今天要說的,到底是什么呢休讳?
前面講的可以當(dāng)做廢話讲婚,哈哈哈,今天我要講的俊柔,是當(dāng)遇到無法重現(xiàn)的Bug時(shí)筹麸,的其中一種定位方式。
問題來源
不知道大家有沒有遇到過雏婶,開發(fā)的App,在自己的手機(jī)上流暢到死竹捉,結(jié)果客戶一用就出現(xiàn)問題。我現(xiàn)在就是這樣尚骄。公司的App在我手機(jī)上面跑的時(shí)候块差,啟動(dòng)速度飛快,但是到了部分客戶手上倔丈,卻變成了打開費(fèi)勁憨闰。要等待十幾秒才把主界面顯示出來。
這是什么用戶體驗(yàn)P栉濉p亩!宏邮!
解決思路
不是所有手機(jī)都有問題泽示,那首先排除了代碼邏輯Bug。極大可能是第三方東西的問題蜜氨。但是我們不能一味的盲目解決械筛。首先我們得找到問題到底出現(xiàn)在哪里,不管能不能解決飒炎,首先得定位出現(xiàn)這些問題的位置埋哟。(其實(shí)我剛開始也是無頭蒼蠅一樣,一直在百度如何提高啟動(dòng)速度。什么第三方初始化不要放在主線程啊等等)
后來實(shí)在沒有辦法毅人,請教了有經(jīng)驗(yàn)之人,了解了一個(gè)定位問題的辦法∩麒担現(xiàn)在就來講講抛计。
說實(shí)話哄孤,當(dāng)你自己的手機(jī),測試的手機(jī)都沒有出現(xiàn)問題的時(shí)候吹截,客戶再不斷說這個(gè)app不好用录豺,這種感覺真不好受,感覺整個(gè)人都要自閉了饭弓。所以双饥,定位方法就是:
定位方法
首先,你得想想為什么會出現(xiàn)這樣弟断,出現(xiàn)這樣無非就幾種原因:
1.第三方框架初始化的時(shí)候可能卡住了(網(wǎng)絡(luò)或者其他原因阻塞主線程)
2.網(wǎng)絡(luò)不好
3.獲取本地?cái)?shù)據(jù)出現(xiàn)問題
........
那么咏花,一打開就這樣,肯定是OnCreat方法里面有關(guān)系阀趴,我們了解里面的流程之后昏翰,就可以進(jìn)入本篇文章的重點(diǎn)了。
重點(diǎn)
你需要一個(gè)后臺服務(wù)器刘急,如果你懂后臺的話棚菊,寫一個(gè)小的Demo,主要就是用于將App上傳的數(shù)據(jù),顯示出來叔汁。那假如不會后臺统求,怎么辦?据块?自行百度了解實(shí)現(xiàn)這是一種方法码邻,能擴(kuò)展你的知識面。不過這個(gè)很費(fèi)時(shí)間哦另假。那怎么辦嘞像屋?這個(gè)好辦,找你們公司的后臺幫忙一下就好了边篮,實(shí)現(xiàn)這個(gè)很簡單己莺。
那么后臺服務(wù)器Demo準(zhǔn)備好了,我們就開始在App上動(dòng)刀子了。我們在每一個(gè)初始化第三方框架的結(jié)束的時(shí)候戈轿,就上傳當(dāng)前的手機(jī)型號凌受、網(wǎng)絡(luò)狀態(tài)、內(nèi)存剩余量凶杖、初始化的第三方信息以及最重要的完成時(shí)間(毫秒級)胁艰。什么?這些都不知道如何獲戎球稹腾么?這個(gè)我下一篇文章將詳細(xì)講解。這樣子杈湾,當(dāng)你Build一個(gè)測試App給用戶打開的時(shí)候解虱,通過時(shí)間的比對,你就會知道漆撞,到底哪一步是造成進(jìn)入慢的罪魁禍?zhǔn)着固6嗾f無益,舉個(gè)栗子:
/**
* 初始化極光推送SDK
*/
JPushInterface.setDebugMode(true);
JPushInterface.init(context);
//調(diào)用網(wǎng)絡(luò)訪問封裝類浮驳,上傳 Log 日志數(shù)據(jù)
new MyLibraryLogAPI().uploadLog("initApp", "App", LogTestUtils.produceLogMsg(this, "極光推送初始化"), 1);
LogTestUtils.produceLogMsg(this, "極光推送初始化")這個(gè)是獲取到我需要的的值悍汛,具體如下:
public static String produceLogMsg(Context context,String problemSite){
String logMsg=null;
logMsg="調(diào)試哪個(gè)步驟造成卡頓:" +
" 當(dāng)前手機(jī):" + getDeviceBrand()+" "+getSystemModel()+
" 時(shí)間:"+getLogTimeString() +
" 本機(jī)總內(nèi)存大小:" +getTotalMemory(context)+
" 當(dāng)前可用內(nèi)存大兄粱帷:" +getAvailMemory(context)+
" 網(wǎng)絡(luò)狀態(tài):" + getAPNType(context)+
" 停留的定位:"+problemSite;
return logMsg;
}
到這里离咐,App的操作就講完了,是不是挺簡單奉件?主要就是后臺這塊有點(diǎn)難搞宵蛀。哈哈哈
當(dāng)我們編譯app,再手機(jī)上測試的時(shí)候,后臺服務(wù)器就會打印我們上傳的數(shù)據(jù)了县貌,附上后臺結(jié)果圖术陶。
這樣子,初始化一目了然煤痕,我們只需要打包給客戶梧宫,叫他打開App,咱們就能定位到問題到底出現(xiàn)在哪里啦!摆碉!
細(xì)心的朋友可能會發(fā)現(xiàn)祟敛,我給出的結(jié)果圖貌似挺正常的,每一個(gè)初始化都在毫秒級就完成了兆解。沒錯(cuò)馆铁,確實(shí)沒有任何問題,因?yàn)槲椰F(xiàn)在還沒有定位出來哪里出現(xiàn)了問題锅睛,哈哈哈哈埠巨,至少現(xiàn)在能知道,客戶出現(xiàn)的問題现拒,至少不是第三方初始化了辣垒,下一步將在網(wǎng)絡(luò)和本地?cái)?shù)據(jù)獲取中定位。
總結(jié)
這是一個(gè)問題定位的方法印蔬,肯定還有其他更好的方法勋桶,因?yàn)槲覉?jiān)信一句話:辦法總會比困難多,一切皆有可能!
碼字不易例驹,望點(diǎn)贊關(guān)注捐韩。也是自己的第一篇正式的文章,如有錯(cuò)誤鹃锈,望批評改正荤胁。????
最后,一張神圖壓底屎债。