我們分析了100個(gè)移動(dòng)應(yīng)用程序,發(fā)現(xiàn)了App崩潰的6個(gè)常見(jiàn)原因!
人們討厭應(yīng)用程序崩潰,尤其是是程序減速或卡死幾秒鐘這樣的現(xiàn)象。 根據(jù)Dimensional Research的一項(xiàng)調(diào)查,61%的用戶(hù)希望程序在4秒內(nèi)啟動(dòng),而49%的用戶(hù)希望在2秒內(nèi)響應(yīng)輸入。 如果應(yīng)用發(fā)生崩潰,凍結(jié)或報(bào)錯(cuò)等現(xiàn)象,53%的用戶(hù)會(huì)將APP卸載。
無(wú)論您的對(duì)象是消費(fèi)者還是企業(yè),崩潰問(wèn)題會(huì)令他們徹底失望。與一些移動(dòng)開(kāi)發(fā)人員進(jìn)行了交談,詢(xún)問(wèn)了他們遇到的最常見(jiàn)的崩潰問(wèn)題有哪些, 他們給出了常見(jiàn)的六種原因:
1.內(nèi)存管理
我所問(wèn)道的每個(gè)人都會(huì)談到內(nèi)存管理,大多數(shù)APP都會(huì)開(kāi)啟許多線程占用系統(tǒng)的內(nèi)存。OpsClarity營(yíng)銷(xiāo)副總裁Sachin Agarwal表示,程序員在編寫(xiě)代碼時(shí)好像在app中只有他們編寫(xiě)的應(yīng)用一樣,同時(shí),他建議在編寫(xiě)程序時(shí),要考慮使其稱(chēng)為為"應(yīng)用生態(tài)系統(tǒng)中的好公民"。
內(nèi)存問(wèn)題并非對(duì)所有開(kāi)發(fā)人員是一樣的。Solstice Mobile業(yè)務(wù)開(kāi)發(fā)副總裁Andrew Whiting說(shuō)"在iOS中,您就可以利用Objective-C來(lái)處理大量?jī)?nèi)存問(wèn)題,"。但是需要權(quán)衡利弊。"在Android上,你需要更深入的控制[內(nèi)存],你可以讓它完全按你想要的那樣做,但這會(huì)增加復(fù)雜性。"
"在Java中遇到[運(yùn)行]內(nèi)存不足,我們發(fā)現(xiàn)通常它與加載大圖像或處理位圖等相關(guān),"New Relic的高級(jí)軟件工程經(jīng)理Jonathan Karon表示。在移動(dòng)SDK技術(shù)性能報(bào)告中并編制了常見(jiàn)的問(wèn)題原因。"實(shí)際上有一些令人驚訝的數(shù)字看起來(lái)像Android上的鏈接器問(wèn)題,無(wú)法找到類(lèi),或者有一個(gè)稱(chēng)為非分類(lèi)鏈接的異常。" 另一方面,iOS應(yīng)用程序經(jīng)常受到NSInternalInconsistency異常的影響,這是因?yàn)楫?dāng)開(kāi)發(fā)人員在一個(gè)地方更改數(shù)組或數(shù)據(jù)集合時(shí),而其他東西正在讀取那里的事物列表。
2.軟件生命周期
迭代的應(yīng)用程序開(kāi)發(fā)過(guò)程及其版本頻繁的發(fā)布,為最小化可行產(chǎn)品進(jìn)入市場(chǎng)打開(kāi)了大門(mén),然后隨著時(shí)間的推移改進(jìn)它,現(xiàn)在這種做法非常流行。但由于對(duì)操作系統(tǒng)和第三方API的依賴(lài)性,使傳統(tǒng)軟件生命周期變的更為復(fù)雜。
"如果你看看***Android更新的系統(tǒng),應(yīng)用程序崩潰的會(huì)很多,"Agarwal說(shuō)。"操作系統(tǒng)本身不穩(wěn)定或操作系統(tǒng)更新了,應(yīng)用程序沒(méi)有更新" 或者用戶(hù)不下載新的版本,這些"你都無(wú)法控制,它說(shuō)明了一個(gè)核心的開(kāi)發(fā)過(guò)程。"
移動(dòng)和云計(jì)算的發(fā)展增加了第三方服務(wù)及其相關(guān)API的使用,從而節(jié)省了時(shí)間并有助于將應(yīng)用程序更快地推向市場(chǎng),但他們有自己的一系列問(wèn)題。
"許多庫(kù)是都有共同的問(wèn)題,"Whiting說(shuō)。 "他們?cè)噲D解決每個(gè)人的問(wèn)題,而不是為任何人提供***解決方案。" 例如,給定的API可能對(duì)特定應(yīng)用程序具有性能限制。
API也可能使用棘手的技術(shù),比如iOS方法調(diào)整。當(dāng)原始代碼(如Apple的API)不可用時(shí),開(kāi)發(fā)人員在原始代碼(如Apple的API)基礎(chǔ)之上進(jìn)行修改。"你可以稱(chēng)之為iOS應(yīng)用程序開(kāi)發(fā)的'黑暗藝術(shù)'之一,"在線旅行社Fareportal的移動(dòng)主管Raman Bhatia說(shuō)。"[但]如果您的應(yīng)用程序代碼以某種方式編寫(xiě),則可能導(dǎo)致崩潰。"
API也可能引起其他問(wèn)題。"API延遲,錯(cuò)誤率,數(shù)據(jù)帶寬, API的版本以及API請(qǐng)求的數(shù)量都可能由小問(wèn)題印發(fā)大問(wèn)題,"Agarwal說(shuō)。然后是API本身,這就需要專(zhuān)門(mén)的工具來(lái)跟蹤所有內(nèi)容。
API也可能導(dǎo)致其他問(wèn)題,如內(nèi)存錯(cuò)誤。 "如果你創(chuàng)造了其他的對(duì)象前已經(jīng)從內(nèi)存中移除的一個(gè)對(duì)象,會(huì)認(rèn)為通常這是沒(méi)有問(wèn)題的,但需要注意的是你不知道后續(xù)創(chuàng)建的對(duì)象到底需不需要引用已經(jīng)刪除的對(duì)象"聯(lián)合創(chuàng)始人和開(kāi)發(fā)者Long Le說(shuō)道"尤其是當(dāng)你引入第三方框架時(shí),就會(huì)出現(xiàn)問(wèn)題。你永遠(yuǎn)無(wú)法確定他們正在清理什么以及他們正在創(chuàng)造什么。"
3.測(cè)試不充分
測(cè)試的需求是很明顯的,但是需要獲得足夠的覆蓋率,特別是對(duì)于大量的Android版本和設(shè)備,可能具有挑戰(zhàn)性。雖然有模擬器,但在服務(wù)器上運(yùn)行的軟件性能限制可能會(huì)與真機(jī)不同。
例如,應(yīng)用程序的一個(gè)線程讀取數(shù)據(jù)庫(kù),同時(shí)第二個(gè)線程嘗試修改這一個(gè)數(shù)據(jù)庫(kù),"這是一個(gè)時(shí)間問(wèn)題," Couchbase移動(dòng)***架構(gòu)師Wayne Carter說(shuō)。"如果他們沒(méi)有在同一時(shí)刻發(fā)生碰撞,那么這個(gè)問(wèn)題就不會(huì)出現(xiàn),可以用日志描述來(lái)掩蓋。" 模擬器通常就不會(huì)和真機(jī)一樣。
在不同的設(shè)備上運(yùn)行不同的系統(tǒng)是個(gè)可行的方案,但是這種方法比模擬器消費(fèi)高。這就需要在預(yù)算和需求之間權(quán)衡
測(cè)試應(yīng)結(jié)合行業(yè)標(biāo)準(zhǔn)和用戶(hù)期望的基準(zhǔn)測(cè)試,以確保開(kāi)發(fā)人員和用戶(hù)可接受的內(nèi)容。測(cè)試也應(yīng)該持續(xù)進(jìn)行。監(jiān)控性能并查找用戶(hù)反饋,然后盡快解決問(wèn)題。
4.網(wǎng)絡(luò)管理
隨著應(yīng)用程序越來(lái)越依賴(lài)網(wǎng)絡(luò),無(wú)論是數(shù)據(jù)還是第三方服務(wù),網(wǎng)絡(luò)管理已成為一個(gè)麻煩的源頭。
發(fā)生崩潰的最主要原因是當(dāng)你正要獲取數(shù)據(jù)、提交了一些東西等待恢復(fù)而APP發(fā)生響應(yīng)或者掛起。運(yùn)營(yíng)副總裁Pravin Vazirani說(shuō)道,可能開(kāi)發(fā)人員使Wi-Fi連接功能非常完善,但用戶(hù)在不好的網(wǎng)絡(luò)區(qū)域時(shí)就會(huì)發(fā)生問(wèn)題
處理網(wǎng)絡(luò)問(wèn)題的一個(gè)好方法是告知用戶(hù)連接中斷,并在可能的情況下提供執(zhí)行可能感興趣的其他操作的機(jī)會(huì)。如果人們了解超出應(yīng)用程序控制范圍的臨時(shí)狀況的原因,他們更有可能保持冷靜,不會(huì)對(duì)軟件感到惱火。
5.錯(cuò)誤狀況和異常處理
由于移動(dòng)開(kāi)發(fā)的復(fù)雜性,一些錯(cuò)誤是不可避免的,無(wú)論是意外的API更改,避免先前檢測(cè)的內(nèi)存問(wèn)題,還是網(wǎng)絡(luò)連接狀況,甚至只是在傳輸大型文件(如圖像或視頻)時(shí)降低數(shù)據(jù)傳輸?shù)乃俣?/p>
在這種情況下,***的方法是給與良好的錯(cuò)誤和異常處理方式。比如用戶(hù)輸入錯(cuò)誤的數(shù)據(jù)、本應(yīng)提供數(shù)值的內(nèi)容而提供文字到文本框內(nèi)等,這樣,應(yīng)用程序就不會(huì)被意外嘗試而報(bào)錯(cuò)。
在任何這些情況下,正確編碼的應(yīng)用程序都會(huì)注意到意外情況,并且在通知用戶(hù)錯(cuò)誤的同時(shí),可以?xún)?yōu)雅地終止進(jìn)程或活動(dòng)。如果你能保持溝通渠道暢通,就會(huì)有更好的機(jī)會(huì)留住用戶(hù)。
6.代碼太多了
***的建議是保持應(yīng)用程序簡(jiǎn)單。找到特定用途的插件,使用插件并編寫(xiě)必要的代碼。企業(yè)移動(dòng)開(kāi)發(fā)公司Lextech Global Services的高級(jí)系統(tǒng)工程師Felipe Laso-Marsetti說(shuō):"***和最無(wú)錯(cuò)誤的代碼是不是你自己編寫(xiě)的代碼。"
你能否真正的創(chuàng)建一個(gè)無(wú)錯(cuò)誤的應(yīng)用程序,特別是在***輪?可能不是。但是,您可以關(guān)注這些故障源,并盡***努力創(chuàng)建強(qiáng)大的異常處理機(jī)制。




























