App可靠性設計

安卓綠色聯盟發表於2018-04-23

可靠性是軟體一個重要的質量屬性,它關注的是軟體功能持續的可用性,以及出現故障之後是否能夠容錯,是否能快速的恢復使用。

可靠性六條基本準則

1、故障應在第一時間被檢測和感知;

2、能避免的故障都不應該發生;

3、不可避免或無法預測的故障,需進行容錯;

4、已發生故障,需在最短時間內得到恢復;

5、物件狀態和生命期都應該是完備的,閉合的;

6、資源必須合理和均衡地使用;

應用作為直接提供使用者服務,與使用者互動最多的環節,其可靠性對使用者體驗的影響巨大,甚至會高於系統對使用者造成的影響。

可靠性故障的現象及根因

應用不響應(ANR)

(1)應用將耗時操作或者同步呼叫放在UI執行緒,廣播接收器裡處理;

(2)應用資源異常,如記憶體,檔案,執行緒等的濫用、洩露;

(3)訊息、通知過載,忙不過來;

(4)獲取系統資源阻塞,比如訪問檔案系統,資料庫,網路,CPU等;

應用啟動不起來,介面卡住凍屏,黑屏,白屏

(1)應用啟動階段必現閃退;

(2)應用在啟動階段做了特殊的耗時、阻塞動作;

(3)應用事件處理bug,例如:應用接收事件但不做任何響應;

(4)應用資源異常,獲取系統資源阻塞;

(5)應用視窗狀態異常,或者使用定製的顯示繪製介面導致;

應用閃退或者頻繁閃退

(1)低階編碼錯誤,多執行緒併發錯誤,app質量不合格;

(2)異常處理不閉合,不完備;

(3)版本相容性問題,硬體相容性問題;

Android應用故障案例分享

一、應用資源異常

1、某輸入法軟體為了保證應用能常駐記憶體不被系統清理,在應用程式退出時,高頻率註冊1秒的定時器,定時器到時候,立即拉起該應用及關聯應用。如果系統反覆清理該應用,該應用會反覆自啟動,導致系統卡頓很嚴重。

2、某應用反覆註冊了800+個應用許可權管理的AppOps Listener,在執行callback的時候直接導致system_server程式的global reference table overflow,系統重啟。

3、某著名社交軟體收到訊息通知之前,需要獲取通話狀態。如果該應用短時間內收到通知訊息特別多,直接會將system_server的binder執行緒全部佔滿,導致其他應用和服務無法與system_server通訊,直接導致系統重啟。

二、應用的特殊行為

1、某社交軟體在自身升級後的首次啟動過程中,長時間進入dex2oat優化過程,應用介面顯示黑屏。按back鍵無效,只能手殺,大量使用者反饋手機黑屏當機。

2、某著名社交軟體收到訊息通知之前,需要獲取通話狀態。如果該應用短時間內收到通知訊息特別多,直接會將system_server的binder執行緒全部佔滿,導致其他應用和服務無法與system_server通訊,直接導致系統重啟。

3、某應用註冊加速度感測器以及近距離感測器監聽的邏輯:若兩個感測器的註冊有任何一個失敗或者被拒,則會進行無限重試,直到兩者全成功,該邏輯會導致距離感測器被反覆執行註冊,致使system_server的fd數量急速增加,超過1024,導致system_server程式崩潰,系統重啟。

三、相容性問題

1、Google 版本升級導致。應用升級N版本之後,應用頻繁閃退,功能缺失,應用無法使用,清除資料和快取也無效,系統負載高,使用者退機。

2、某應用推送最新版本異常。應用升級之後,使用者無法使用。

3、ROM升級之後,導致應用無法使用。ROM升級之後,該應用讀取電話薄失敗,應用頻繁Crash,導致手機電話過程中無法結束通話。

可靠性設計的一般準則

一、業務功能的可靠性設計

1、合理分配執行任務:哪些放在前臺?哪些放在後臺?

2、仔細設計任務同步&併發:採用同步還是非同步?多工併發?

3、任務負載的均衡:多個業務執行流有序執行;

4、物件生命週期的閉合;

5、良好的使用者互動和提示:別讓使用者以為應用crash

二、應用資料來源可靠性設計

1、應用核心的資料/檔案應有備份和容錯設計

2、來自外部輸入裝置的資料,應用應能判別資料的合法性,例如被破壞的資料來源,非法的外部資料/命令

3、向外發起的服務請求,要有超時和有限重試設計,外部擾動不導致應用卡死

4、外部發起的攻擊性請求,例如通知,廣播,要有防護設計

三、應用的資源可靠性設計

1、分配的資源必須在確定的地方釋放;

2、使用資源必須有明確的上界,如記憶體,磁碟,檔案,執行緒。

四、優秀的編碼能力

優秀的編碼能力是應用可靠性設計的基礎;

五、完備的測試故障用例

事先考慮到應用內部、外部可能發生的故障,將故障的集合定義出來,針對性的設計故障用例。

相關文章