Android崩潰日志收集和保存解析
面試
記得很久很久以前的一次面試中被面試官問:
面試官:你的崩潰日志是怎么收集的?
我答:集成騰訊的Bugly收集。
面試官:如果不用第三方呢?
我:好像有個什么異常的handler,具體想不起來了
那么今天我們就來聊聊關于崩了日志收集的以上兩種方式UncaughtExceptionHandler和Bugly
UncaughtExceptionHandler
- UncaughtExceptionHandler UncaughtExceptionHandler類是java1.5里新增的Thread類里面的一個函數式接口類的,接口處理器時調用線程突然終止,由于未捕獲到異常。當一個線程要終止由于未捕獲到異常的Java虛擬機將查詢線程其使用的UncaughtExceptionHandler.getUncaughtExceptionHandler,將調用處理程序的uncaughtException方法,將線程和異常作為參數。
首先我們需要編寫該接口實現類,重寫uncaughtException方法,一旦應用發(fā)生異常該方法就會觸發(fā),所以我們的業(yè)務邏輯就必須在這個接口中實現。
override fun uncaughtException(t: Thread, e: Throwable) { //崩潰信息 val writer = StringWriter() val printWriter = PrintWriter(writer) e.printStackTrace(printWriter) var cause: Throwable? = e.cause while (cause != null) { cause.printStackTrace(printWriter) cause = cause.cause } printWriter.close() val result: String = writer.toString() ...... }
通過入參StringWriter的PrintWriter獲取到Throwable信息,再將StringWriter的信息打印出來就是應用的崩潰信息,獲取過程雖稍顯復雜但使用還是極其簡單。之后就是將日志保存在本地和上傳服務器的過程了。
val fos = FileOutputStream(path + fileName) fos.write(sb.toString().toByteArray())
既然有儲存那么就一定要有刪除功能,否則一旦數據量大了后手機內存就不夠用了,我們設置一個清除15天前數據。
private fun deleteFile() { val file = File(path) val nowDate = Date() if (file.exists() && file.listFiles().isNotEmpty()) { for (item in file.listFiles()) { if (item.isFile) { val split = item.name.split(".") if (split.isNotEmpty()) { val old = split[0].substring(6, split[0].length)//截取時間戳 val oldDate = formatter.parse(old) val diff = nowDate.time - oldDate.time val days = diff / (1000 * 60 * 60 * 24) val minutes = (diff % (1000 * 60 * 60)) / (1000 * 60) if (days > 15) { item.delete() } } } } } }
最后,當然是需要初始化這個工具類,盡可能在應用啟動時初始化。
override fun onCreate() { super.onCreate() CrashHandler.instance.init(this) }
如需保存到服務器則保存本地的同時即可保存到服務器。這里分享一個當時遇到的問題,debug和realase兩個版本中一個可以在保存目錄找到日志,一個根本找不到該目錄。經過反復對比和查找資料才發(fā)現,原來是cacheDir和externalCacheDir的區(qū)別,哈哈哈,著實給我整懵逼了。
Bugly
為移動開發(fā)者提供專業(yè)的異常上報和運營統(tǒng)計,幫助開發(fā)者快速發(fā)現并解決異常,同時掌握產品運營動態(tài),及時跟進用戶反饋。
Bugly是一款免費的三方庫,提供崩潰日志和應用更新、運營統(tǒng)計等功能,去年應用更新功能(全量更新)被割掉了,非常遺憾,但崩潰日志還能正常使用并且做的也很不錯。相當于它提供后臺存儲,對于一些NDK之類的底層報錯和代碼混淆可以通過上傳符號表查看報錯信息。
在build.gradle文件中添加配置和依賴
android { defaultConfig { // 設置支持的SO庫架構 abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', ndk { 'arm64-v8a' } } } //其中l(wèi)atest.release指代最新Bugly SDK版本號,也可以指定明確的版本號,例如4.0.3 } dependencies { implementation 'com.tencent.bugly:crashreport:latest.release'
盡可能早的初始化
CrashReport.initCrashReport(getApplicationContext(), "注冊時申請的APPID", false);
之后出現應用異常即可在賬號內查看和處理,可以說功能還是比較齊全的。
總結
其實現在網上很多關于崩潰日志的庫,啥蒲公英、加固類Sdk都有,最終還是得根據項目情況選擇一款條件合適得工具。UncaughtExceptionHandler使用也簡單,但需要開發(fā)者自己使用代碼做好日志整理、收集、上傳功能,如果涉及上傳就得需要后端配合,無疑又增加了人員維護,好處就是自己服務器控制數據。三方庫使用就更簡單了,連后端都省了,但因此也帶來了弊端,始終數據在別人服務器中,這個不可控,如涉及隱私可能也不會選擇它。
以上就是Android崩潰日志收集和保存解析的詳細內容,更多關于Android崩潰日志收集保存的資料請關注腳本之家其它相關文章!
相關文章
Android高效加載大圖、多圖解決方案 有效避免程序OOM
這篇文章主要為大家詳細介紹了Android高效加載大圖、多圖解決方案,有效避免程序OOM,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10Android 重寫ViewGroup 分析onMeasure()和onLayout()方法
這篇文章主要介紹了Android 重寫ViewGroup 分析onMeasure()和onLayout()方法的相關資料,需要的朋友可以參考下2017-06-06Android實現氣泡布局/彈窗效果 氣泡尖角方向及偏移量可控
這篇文章主要為大家詳細介紹了Android實現氣泡布局/彈窗效果,可控制氣泡尖角方向及偏移量,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08Android Studio 通過登錄功能介紹SQLite數據庫的使用流程
SQLite是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統(tǒng),它包含在一個相對小的C庫中。這篇文章主要介紹了Android Studio 通過登錄功能介紹SQLite數據庫的使用流程,需要的朋友可以參考下2018-09-09