做為程序員,不愿意看到的就是自己寫的程序崩潰,特別是遇到?jīng)]有錯(cuò)誤信息的崩潰的時(shí)候,往往程序員自己也就隨之一起崩潰了。如何捕獲Android程序產(chǎn)生異常時(shí)的崩潰信息,粵嵌Android培訓(xùn)中心為你解析一下,希望能夠帶給你一些啟發(fā),同時(shí)解決一些生產(chǎn)上的難題。
在應(yīng)用從開發(fā)慢慢過渡到線上部署的時(shí)候,開發(fā)者就逐漸切換到依靠程序日志/運(yùn)行狀態(tài)來進(jìn)行問題的排查和解決。通常一些第三方廠商會(huì)提供這些服務(wù),譬如騰訊的bugly,fabric,Umeng等。前兩者的異常收集和處理較好,然而有一個(gè)通用的問題就是需要將symbol文件上傳到廠商服務(wù)器,顯然對于注重應(yīng)用安全和IP保護(hù)的開發(fā)者,這個(gè)行為是值得著重權(quán)衡的。而Umeng則注重于運(yùn)營數(shù)據(jù),對于異常捕獲沒有特別大的優(yōu)勢。所以本文的關(guān)注點(diǎn)就是如何在Android項(xiàng)目內(nèi)部實(shí)現(xiàn)自己異常捕獲和分析模塊。
如何捕獲Java異常?這個(gè)問題乍一聽感覺沒有任何難度,這不是用以下的處理Crash大法就解決了嗎?且不說這樣做的對錯(cuò),只是并不能很好的解決我們的問題,問題就在于我們對于會(huì)發(fā)生異常的地方?jīng)]有辦法完全預(yù)知,對于Checked Exception編譯器會(huì)提示我們處理,然而對于Runtime Exception,總是難以預(yù)防。NPE常年占據(jù)Java Eeception的Top 1不是沒有道理。所以我們的期望是什么,就算我們沒有指定Catch Exception,在程序發(fā)生異常的時(shí)候,也能通知到我們。
如何捕獲Native異常?與Java層的異常不同,Native層的異常捕獲要稍微復(fù)雜一些。難點(diǎn)主要在于當(dāng)Native層發(fā)生異常時(shí),JVM在收到異常信號(hào)后會(huì)直接Shutdown,所以我們的Thread.UncaughtExceptionHandler不會(huì)被執(zhí)行。所以我們必須捕獲Linux的異常信號(hào),并執(zhí)行我們自己的信號(hào)處理函數(shù)。在此基礎(chǔ)上,我們還必須自己來實(shí)現(xiàn)Crash Dump生成和解析。
如何提示用戶發(fā)送錯(cuò)誤信息?我們在前面已經(jīng)成功的捕獲了Java異常和Native異常,那么接下來要做的就是順理成章的處理,只要提示用戶將我們需要的Java棧和Native Dmp文件發(fā)送給我們,我們就可以進(jìn)行問題排查和修復(fù)了。由于篇幅原因,這里就給出一個(gè)思路,我們可以在Java Excpetion和 Native DumpCallback的時(shí)候,新起一個(gè)進(jìn)程,在這個(gè)進(jìn)程里面進(jìn)行日志上傳,甚至可以彈出一個(gè)Activity告知用戶,提升用戶體驗(yàn)。
當(dāng)應(yīng)用上線之后,脫離了Logcat提供的便利,開發(fā)者應(yīng)該如何獲取錯(cuò)誤信息進(jìn)行異常修復(fù),本文提供了一些隨手可行的思路,包含了Java層和Native層不同的處理辦法,通過實(shí)例代碼步步深入,希望帶給大家一起啟發(fā),同時(shí)解決生產(chǎn)上的一些實(shí)際問題。以上是粵嵌Android培訓(xùn)中心解析的Android應(yīng)用的異常捕獲。