Android性能優化9-ANR完全解析

来源:https://www.cnblogs.com/ganchuanpu/archive/2018/07/09/9205530.html
-Advertisement-
Play Games

1.什麼是ANR 在Android上,如果你的應用程式有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程式無響應(ANR:Application Not Responding)對話框。用戶可以選擇讓程式繼續運行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話框。因 ...


1.什麼是ANR

在Android上,如果你的應用程式有一段時間響應不夠靈敏,系統會向用戶顯示一個對話框,這個對話框稱作應用程式無響應(ANR:Application Not Responding)對話框。用戶可以選擇讓程式繼續運行,但是,他們在使用你的應用程式時,並不希望每次都要處理這個對話框。因此,在程式里對響應性能的設計很重要,這樣,系統不會顯示ANR給用戶。

2.ANR產生的原因

ANR產生的根本原因是APP阻塞了UI線程。在android系統中每個App只有一個UI線程,是在App創建時預設生成的,UI線程預設初始化了一個消息迴圈來處理UI消息,ANR往往就是處理UI消息超時了。那麼UI消息來源有哪些呢?主要有兩種來源:

2.1 來自於AMS的回調消息

在Android系統中,應用程式是有Android的四大組件組成,AMS負責對應用程式四大組件生命周期的管理,當AMS對應用程式組件的生命周期進行回調超過AMS定義的響應時間時,AMS就會報ANR。出現這種情況,一般是因為在這些組件的回調函數裡面進行了耗時操作(如網路操作、SD卡文件操作、資料庫操作、大量計算等),AMS對組件常見的回調函數及超時時間如下:

Activity: onCreate(), onResume(), onDestroy(), 
onKeyDown(), onClick()等,超時時間5s

Application: onCreate(), onTerminate()等,超時時間5s

Service: onCreate(), onStart(), onDestroy()等,超時時間20s

BroadcastReceiver:onReceiver(),前臺APP廣播超時時間是10s,後臺App是60s

2.2 App自己的發出的消息

除了AMS對四大組件的回調消息運行在UI線程外,有些操作也是運行在UI線程的:

AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()等,超時5s

Mainthread handler: handleMessage(), post*(runnable r)等,超時5s

3.怎樣避免ANR

當我們知道ANR的產生原因之後,就可以較為輕鬆的避免ANR了。並且Android為我們提供了很多解決方法。主要歸為一下幾類。

1:UI線程儘量只做跟UI相關的工作,但一些複雜的UI操作,還是需要一些技巧來處理,不如你讓一個Button去setText一個10M的文本,UI肯定崩掉了,不過對於此類問題,分段載入貌似是最好的方法了。
2:讓耗時的工作(比如資料庫操作,I/O,連接網路或者別的有可能阻礙UI線程的操作)把它放入單獨的線程處理。
3:儘量用Handler來處理UIthread和別的thread之間的交互。

4.發佈的程式怎樣收集ANR異常

對於發佈的程式,ANR異常是很那捕獲不到的(我查找過很多資料,如果您有很好的捕獲辦法,歡迎再下方留言),所以我們需要採用其它的方法來分析ANR。app在產生ANR異常後,會將異常信息寫入"/data/anr/traces.txt"文件我們可以通過收集用戶的這個文件,就可以來獲取用戶產生ANR的地方了。 

ANR的Log信息保存在:/data/anr/traces.txt,每一次新的ANR發生,會把之前的ANR信息覆蓋掉。

我在一個按鈕的onClick事件里寫瞭如下代碼

while(true){}

來故意產生一個ANR異常,然後打開/data/anr/traces.tx文件,主要有用的地方如下圖:

我們可以看到,在trace.txt文件里已經定位到異常產生的地方。所以,在用戶反饋界面,當我們發現戶反饋內容里是否出現了"無響應"等字眼的時候,就可以提示用戶是否上傳異常文件,來幫助我們改善產品之類的。當然,現在流氓猖狂,貌似做到這麼細緻產品的,為數不多了。

ANR屬於慢性崩潰,Android應用里的還存在著很多的強制崩潰,別如你執行了3/0了,空指針異常了等等,這些情況應用程式會直接崩掉,用戶體驗超級差

 

https://blog.csdn.net/itachi85/article/details/6918761

  


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 大家好,給大家帶來 的概述,希望你們喜歡 每日一句: Success is connecting with the world and making people feel. 《名揚四海》 設計思路 當我們面臨製作登錄和註冊功能的實現時,我們需要先 設計登錄界面的佈局和註冊界面的佈局,做到有完 ...
  • 前言 大家好,給大家帶來 的概述,希望你們喜歡 學習目標 1. 掌握SQLite資料庫的使用,能夠實現用資料庫來保存用戶的信息; 2. 學會運用好個人資料,以及個人資料的修改功能實現; 3. 個人資料包括用戶名,昵稱,性別,簽名,QQ號或個人社交賬號的記錄等。 資料庫的創建 資料庫類 該類繼承 創建 ...
  • //這裡有一個模擬器沙盒路徑(完整路徑) NSString* index=@"/Users/junzoo/Library/Application Support/iPhone Simulator/7.0.3/Applications/63925F20-AF97-4610-AF1C-B6B4157D1 ...
  • "使用AppleDoc快速生成iOS開發文檔 _ 皮卡丘♪~(´ε` )" "用 appledoc 生成文檔 _ Garan no dou" "xcode select_ error_ tool 'xcodebuild' requires Xcode, but active developer di ...
  • 為什麼不使用xml繪製Andoird的UI? 類型不安全 非空不安全 xml迫使你在很多佈局中寫很多相同的代碼 設備在解析xml時會耗費更多的cpu運行時間和電池 最重要的時,它允許任何代碼重用 簡單案例 findViewById() LayoutParams 使用 描述佈局參數,其中寬高都是 設置 ...
  • 添加依賴 Color 不透明的紅色 Dimensions 使用 和`sp dip(dipValue) sp(spValue)` applyRecursively() applyRecursively()應用於lambda表達式的本身,然後遞歸地運用在他的子view 以上表示,該 中的 的`textS ...
  • Alamofire框架的使用一 —— 基本用法 對於使用Objective-C的開發者,一定非常熟悉AFNetworking這個網路框架。在蘋果推出的Swift之後,AFNetworking的作者專門用Swift來編寫一個類似AFNetworking的網路框架,稱為Alamofire。Alamofi ...
  • Live Photo開發,瞭解之後可以將其應用於開發過程中。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...