去年穀歌進行的一項內部調查顯示 Play Store 中超過 40% 的一星應用存在穩定性問題。另外一方面,對於性能卓越的應用,人們打分和評論每每愈來愈好,這讓它們在 Google Play 中的排名上升,下載量也隨之增長。不只如此,用戶參與度也更高,並且願意花更多的時間和金錢在這些應用上。編程
所以,解決應用穩定性問題可以顯著影響到應用成功與否。網絡
經過對應用質量的客觀測量,開發者可以輕易發現應用亟待解決的穩定性問題,爲此咱們在 Google Play Console 添加了一款名爲 Android vitals 的新板塊。藉助 Android vitals,開發者無須添加額外工具代碼或者庫就能瞭解應用存在的性能及穩定性問題。當應用在大量設備上運行時,Android vitals 會收集與應用性能相關的匿名數據。經過這種途徑得到的信息量是其餘方式沒法匹及的,即便是硬件實驗室測試也不行。多線程
Android vitals 能夠向開發者發送如下三種警告:崩潰、應用程序沒法響應以及渲染次數。這三種狀況都會直接影響到用戶體驗以及他們對應用的評價。此外,用戶可能不會將 「異常耗電事件」 這類不良行爲與您的應用直接聯繫起來。工具
這篇文章將探討其中如下兩個問題:性能
1.過分喚醒:過分喚醒會對電池壽命形成影響,並且在沒法及時充電的狀況下,可能致使用戶沒法繼續使用設備。此類行爲可能會讓用戶迅速卸載您的應用;測試
2.應用程序沒法響應 (ANR)事件:當應用的用戶界面卡住時候,此類事件會被觸發。在界面凍結時,若您的應用在前臺運行,會出現對話框提醒用戶 「關閉應用」 或者 「等待響應」。對用戶而言,此類行爲和應用崩潰同樣糟糕。他們可能不會立刻卸載您的應用,可是若是 ANR 問題一直不解決,就頗有可能會尋找其它替代應用。大數據
爲了延長電池續航時間,屏幕關閉後,Android 設備會禁用主 CPU 內核,進入深度睡眠模式。除非用戶喚醒設備,設備最好能夠儘量長地保持這種狀態。不過,在發生某些事件的狀況下,仍是頗有必要喚醒 CPU 並向用戶發出警告 —— 好比說,鬧鐘觸發或者收到新消息。開發者能夠經過喚醒鬧鐘 (wakeup alarm) 來處理此類警告,不過也不必定非要這麼操做,在下文中會對此稍加解釋。到目前爲止,喚醒看上去彷佛是個不錯的東西,讓重要事情能引發用戶注意,不過要是喚醒太屢次就拔苗助長,電池壽命也會大打折扣。ui
Android vitals 可以幫助開發者瞭解本身的應用是否存在喚醒次數太多的問題。經過收集有關應用行爲的匿名數據,Android vitals 能夠顯示有多少比例的用戶在設備滿電以後,每小時經歷 10 次以上的設備喚醒。關鍵就是看有沒有紅色的圖標出現,若圖標出現,則說明應用已經越過了不良行爲門檻,屬於 Google Play 中表現最次的一檔應用,而您則需要想辦法改善應用行爲了。 編碼
開發者主要是經過 AlarmManager API 設定 RTC_WAKEUP 或 ELAPSED_REALTIME_WAKEUP 旗標,讓應用在特定時間或者在某一時間間隔後喚醒設備。該功能須謹慎對待,僅在沒有其它更優的任務調度和通知機制的狀況下才可以使用。在使用喚醒鬧鐘的時候,您須要考慮如下幾點:spa
-- 批量操做:批量操做任務而不是屢次喚醒系統進行操做,這使設備能更長時間處於睡眠狀態。
-- 標準:您能夠明確任務運行須知足的具體標準,如網絡可用性或者電池充電狀態。設定標準可以避免喚醒設備以及沒必要要的應用運行。
-- 持續性以及自動退避 —— 繼續執行任務 (即便在重啓後) 而且在失敗的狀況能自動重試。
-- 低耗電模式 (doze) 兼容性 —— 僅在低耗電模式或者應用待機模式未設定任何限制的狀況下,任務才能運行。
當且僅當消息推送以及任務調度對您的任務不適用時,您才能夠利用 AlarmManager 設定喚醒鬧鐘。換個角度來講就是,僅當您想要在特定時間觸發鬧鐘,不考慮網絡以及其它狀況,喚醒鬧鐘纔是必要的。
爲了解決過分喚醒問題,您需要確認應用在什麼地方設定了喚醒鬧鐘,而後下降這些鬧鐘的觸發頻率。
那麼如何查看應用在哪些地方設了喚醒鬧鐘呢?您能夠打開 Android Studio 中的 AlarmManager 類,右擊 RTC_WAKEUP 或者 ELAPSED_REALTIME_WAKEUP 域,選擇 "Find Usages (查找使用)",而後您就能看到項目中全部使用到此類旗標的事件了。仔細查看每一種事件,而後考慮可否改用更爲智能的任務調度機制。
若您認爲使用喚醒鬧鐘沒法避免,那麼若是您的鬧鐘標籤知足如下要求,Play Console 能夠提供更好的分析數據:
對用戶而言,ANR 就是指當他們試圖與應用進行交互時,但界面卡住的事件。界面卡屏幾秒後,會出現對話框讓用戶選擇繼續等待或者強行中止應用。
從開發者的角度來看,ANR 則是指應用運行的操做耗時太久,如磁盤或網絡 I/O,致使主線程阻塞。主線程 (有時候也被稱爲 UI 線程) 主要負責響應用戶事件以及每秒刷新 60 次屏幕。所以很關鍵的一點將任何可能延時主線程工做的操做轉到後臺線程。
Android vitals 能收集並利用應用 ANR 事件的匿名數據,提供多個級別的 ANR 具體報告。主界面上概述了您應用中 ARN 活動的概覽信息,顯示用戶至少經歷一次 ANR 事件的日對話比重,而且提供前一天以及前 30 天的狀況的單獨報告。同時也提供了不良行爲門檻。
如上文所述,當應用進程影響到主線程時,ANR 事件會被觸發,而致使這種阻塞現象的緣由各有不一,較爲常見的有:
尋找觸發 ANR 的緣由不容易,咱們拿 URL 類舉個例子:
這兩種狀況都極可能致使長時間阻塞操做。幸虧咱們有 StrictMode,不用再本身瞎猜是什麼緣由致使 ARN 了。在調試構建的時候,您可使用這個工具捕捉主線程上的意外磁盤或網絡訪問。
您能夠在應用中使用 StrictMode#setThreadPolicy,自定義檢查項,包括磁盤和網絡 I/O 以及您經過 StrictMode#noteSlowCall 在應用中觸發的慢調用。同時,您也能夠本身選擇讓 StrictMode 經過何種方式告知已檢測到阻塞調用:應用崩潰、日誌記錄仍是顯示對話框?您可參看 ThreadPolicy.Builder class 獲取進一步信息。
一旦您消除主線程上的阻塞調用,請記得再上傳應用至 Play Store 前,關閉 StrictMode。
解決過分喚醒以及 ANR 問題可以提高應用質量及穩定性,提升應用評分,獲取更多好評,最終增長下載量。使用 Android vitals 讓您輕鬆快速地瞭解應用中亟待解決的問題。發現並解決代碼中的這些問題可能並不容易,可是您能夠利用工具和技術有效地完成工做。
點擊這裏您可查看 Android 和 Google Play 相關內容信息