人們討厭應(yīng)用程序崩潰,尤其是是程序減速或卡死幾秒鐘這樣的現(xiàn)象。 根據(jù)Dimensional Research的一項(xiàng)調(diào)查,61%的用戶希望程序在4秒內(nèi)啟動(dòng),而49%的用戶希望在2秒內(nèi)響應(yīng)輸入。 如果應(yīng)用發(fā)生崩潰,凍結(jié)或報(bào)錯(cuò)等現(xiàn)象,53%的用戶會(huì)將App卸載。

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