android 程序崩潰crash日志的捕捉
之前在項目開發過程中,一直會遇到程序崩潰了,但是測試組的哥哥們又沒及時的導出日志....
后來在誑群的時候聽別人說起,騰訊有那么一個叫bugly的東西
將其作為第三方jar文件引入其中,並且進行一些簡單的配置即可:程序崩潰的crash日志會自動的上傳到他騰訊那邊給的后台上面,在線查看日志
問題來了:
- 怎么實現的呢
- 為什么他們就可以去捕獲那一段日志?
- 程序不是已經崩潰了嗎?
- 獲取日志的代碼為啥還可以運行?
原理
搜索到這篇文章Android平台的崩潰捕獲機制及實現
這篇文章來自一個做這方面產品的大牛。下面對其中關於原理的描述做一些引用
Java提供了一個接口給我們,可以完成這些,這就是UncaughtExceptionHandler,Uncaught異常發生時會終止線程,此時,系統便會通知UncaughtExceptionHandler,告訴它被終止的線程以及對應的異常,然后便會調用uncaughtException函數。如果該handler沒有被顯式設置,則會調用對應線程組的默認handler。
原來這玩意是java做的活,是java對其線程出現unCaught異常進行捕獲的處理,和android本身無關
使用的注意點
android應用中必須在Application中調用Thread.setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler);
在java中,可以在任何的線程中調用setDefault方法。但是在android中不行,必須是在application中調用
在Android應用程序中,全局的Application和Activity、Service都同屬於UI主線程,線程名稱默認為“main”。所以,在Application中應該為UI主線程添加UncaughtExceptionHandler,這樣整個程序中的Activity、Service中出現的UncaughtException事件都可以被處理。
如果多次調用setDefaultUncaughtExceptionHandler設置handler,以最后一次為准。
將閃退信息存儲到文件系統中。不能存到SharedPreferences中,因為打開SP需要使用一個新的線程(Android內部實現),而這在UnCaughtExceptionHandler中,這是不被允許的。
Android實現多次閃退清除數據
這篇文章里面的作者描述的是,用一個叫做acra的開源項目,來實現當短時間內程序發生幾次崩潰,則刪除某些數據以滿足對程序的修復。