App Crash 詳解

和你一起終身學(xué)習(xí),這里是程序員Android
經(jīng)典好文推薦,通過閱讀本文,您將收獲以下知識點(diǎn):
一、App Crash 概述
二、檢測Crash 問題
三、Android vitals
四、分析App Crash
五、復(fù)現(xiàn)Crash 小提示
六、Logcat 抓取復(fù)現(xiàn)問題Crash的Log
一、 App Crash 概述
Android APP Crash通常是由未捕獲的Exception或signal引起app異常退出。
如果app使用Java語言編寫,那么,當(dāng)Throwable拋出未處理的異常時,此時就會引起?app Crash。
如果app 使用native-code編寫,那么,當(dāng)執(zhí)行時遇到未處理的signal(例如SIGSEGV)時,app就會?Crash并退出。
當(dāng)應(yīng)用程序崩潰時,Android終止應(yīng)用程序的進(jìn)程并顯示一個對話框,讓用戶知道應(yīng)用程序已經(jīng)停止。

app crash 舉例
App Crash?不僅發(fā)生在前臺進(jìn)程,任何app組件,例如Broadcast Receivers,Content Providers,Service等在后臺運(yùn)行的組件,也可以引起App Crash。這些Crash很容易引起用戶混淆,因?yàn)樗麄儧]有直接參與到你的app中。
二、檢測Crash 問題
當(dāng)你的app已經(jīng)上線,過多的Crash?會給用戶帶來一個很糟糕的體驗(yàn)。Google也意思到這一點(diǎn),Android vitals會幫我們意識到此問題的嚴(yán)重性。
三、 Android vitals
當(dāng)你的應(yīng)用出現(xiàn)過多的Crash時候,Android vitals可以通過Play Console幫助你提高app的性能。Android vitals?認(rèn)為APP?過多Crash場景如下:
使用一天
APP,出現(xiàn)一次Crash的概率在1.09%之上。使用一天
APP,出現(xiàn)兩次或多次 Crash 的概率在0.18%之上
如需獲取更多信息,請查看Play Console
四、 分析App Crash
解決崩潰可能很困難。但是,如果您能夠確定崩潰的根本原因,則很可能可以找到解決方案。
有很多情況可能會導(dǎo)致應(yīng)用程序崩潰。一些原因是顯而易見的,比如檢查一個空值或空字符串,而另外一些更微妙,比如將無效參數(shù)傳遞給API甚至是復(fù)雜的多線程交互。
1.讀取堆棧信息
解決App Crash,首先要找到在那些代碼發(fā)生的。你可以通過logcat或者play Console等輸出的堆棧信息進(jìn)行分析查看。

Crash 堆棧信息
上述Crash 堆棧信息包含 以下信息
1.Crash app 包名
2.Crash app PID
3.引起Crash的異常信息(此異常時引起Crash的重要原因)
4.引起Crash 的代碼位置,行號,哪個函數(shù)調(diào)用等等
5.對于被調(diào)用的每個函數(shù),另一行顯示前面的調(diào)用站點(diǎn)(稱為棧幀)。
通過走棧和檢查代碼,你可能會發(fā)現(xiàn)一個地方傳遞了一個不正確的值。如果您的代碼沒有出現(xiàn)在堆棧跟蹤中,則可能是在某處將異常操作傳遞給了一個無效的參數(shù)。您可以經(jīng)常通過檢查堆棧跟蹤的每一行,找到您使用的任何API類,并確認(rèn)您傳遞的參數(shù)是正確的,并且從允許的地方調(diào)用該類來判斷發(fā)生了什么。
五、復(fù)現(xiàn)Crash 小提示
您可能無法通過啟動模擬器或?qū)⒃O(shè)備連接到計(jì)算機(jī)來重現(xiàn)問題。開發(fā)環(huán)境傾向于擁有更多資源,例如帶寬,內(nèi)存和存儲。使用異常類型來確定稀缺資源,或者在Android版本,設(shè)備類型或應(yīng)用版本之間找到關(guān)聯(lián)。
1. OutOfMemoryError 內(nèi)存錯誤
如果你有一個OutOfMemoryError,那么你可以創(chuàng)建一個內(nèi)存容量較低的模擬器來開始,下圖顯示了您可以控制設(shè)備上的內(nèi)存量的AVD管理器設(shè)置。

創(chuàng)建低 RAM模擬器復(fù)現(xiàn)低內(nèi)存問題
2. Networking exceptions 網(wǎng)絡(luò)異常
由于用戶經(jīng)常進(jìn)出移動或WiFi網(wǎng)絡(luò)覆蓋范圍,因此在應(yīng)用程序網(wǎng)絡(luò)中,例外情況通常不應(yīng)被視為錯誤,而應(yīng)視為意外發(fā)生的正常運(yùn)行狀況。
如果您需要重現(xiàn)網(wǎng)絡(luò)異常(例如UnknownHostException),請嘗試在應(yīng)用程序嘗試使用網(wǎng)絡(luò)時打開飛行模式。
另一個選擇是通過選擇網(wǎng)絡(luò)速度仿真和/或網(wǎng)絡(luò)延遲來降低仿真器中網(wǎng)絡(luò)的質(zhì)量。您可以使用AVD管理器上的速度和延遲設(shè)置,也可以使用-netdelay和-netspeed標(biāo)志啟動模擬器,如以下命令行示例所示:
emulator -avd [your-avd-image] -netdelay 20000 -netspeed gsm
六、 Logcat 抓取復(fù)現(xiàn)問題Crash的Log
Logcat是一個命令行工具,用于轉(zhuǎn)儲系統(tǒng)消息日志,其中包括設(shè)備引發(fā)錯誤時的堆疊追蹤以及從您的應(yīng)用使用Log類編寫的消息。
1. 命令行語法
[adb] logcat [
Logcat 命令行選項(xiàng)
2. 啟動 logcat
[adb] logcat [3. 過濾日志輸出
Log?類允許您在logcat?工具中顯示的代碼中創(chuàng)建日志條目。常用的日志記錄方法包括:
Log.v(String, String)(詳細(xì))
Log.d(String, String)(調(diào)試)
Log.i(String, String)(信息)
Log.w(String, String)(警告)
Log.e(String, String)(錯誤)
4. Logcat 個人建議
抓取Log之前請先清除緩存中的Log信息,防止干擾分析問題。
清除緩存Log信息命令如下:
adb logcat -c
復(fù)現(xiàn)問題,抓取log方法如下
adb logcat > 追加到指定文件中

Logcat抓取Log個人建議
至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請聯(lián)系小編刪除。同時感謝您的閱讀,期待您的關(guān)注。
點(diǎn)個在看,方便您使用時快速查找!
