App Crash 詳解

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

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

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

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

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