您好,登錄后才能下訂單哦!
這篇文章主要講解了“Android崩潰日志收集和保存代碼分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Android崩潰日志收集和保存代碼分析”吧!
UncaughtExceptionHandler UncaughtExceptionHandler類是java1.5里新增的Thread類里面的一個(gè)函數(shù)式接口類的,接口處理器時(shí)調(diào)用線程突然終止,由于未捕獲到異常。當(dāng)一個(gè)線程要終止由于未捕獲到異常的Java虛擬機(jī)將查詢線程其使用的UncaughtExceptionHandler.getUncaughtExceptionHandler,將調(diào)用處理程序的uncaughtException方法,將線程和異常作為參數(shù)。
首先我們需要編寫該接口實(shí)現(xiàn)類,重寫uncaughtException方法,一旦應(yīng)用發(fā)生異常該方法就會(huì)觸發(fā),所以我們的業(yè)務(wù)邏輯就必須在這個(gè)接口中實(shí)現(xiàn)。
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() ...... }
通過(guò)入?yún)tringWriter的PrintWriter獲取到Throwable信息,再將StringWriter的信息打印出來(lái)就是應(yīng)用的崩潰信息,獲取過(guò)程雖稍顯復(fù)雜但使用還是極其簡(jiǎn)單。之后就是將日志保存在本地和上傳服務(wù)器的過(guò)程了。
val fos = FileOutputStream(path + fileName) fos.write(sb.toString().toByteArray())
既然有儲(chǔ)存那么就一定要有刪除功能,否則一旦數(shù)據(jù)量大了后手機(jī)內(nèi)存就不夠用了,我們?cè)O(shè)置一個(gè)清除15天前數(shù)據(jù)。
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)//截取時(shí)間戳 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() } } } } } }
最后,當(dāng)然是需要初始化這個(gè)工具類,盡可能在應(yīng)用啟動(dòng)時(shí)初始化。
override fun onCreate() { super.onCreate() CrashHandler.instance.init(this) }
如需保存到服務(wù)器則保存本地的同時(shí)即可保存到服務(wù)器。這里分享一個(gè)當(dāng)時(shí)遇到的問(wèn)題,debug和realase兩個(gè)版本中一個(gè)可以在保存目錄找到日志,一個(gè)根本找不到該目錄。經(jīng)過(guò)反復(fù)對(duì)比和查找資料才發(fā)現(xiàn),原來(lái)是cacheDir和externalCacheDir的區(qū)別,哈哈哈,著實(shí)給我整懵逼了。
Bugly
為移動(dòng)開(kāi)發(fā)者提供專業(yè)的異常上報(bào)和運(yùn)營(yíng)統(tǒng)計(jì),幫助開(kāi)發(fā)者快速發(fā)現(xiàn)并解決異常,同時(shí)掌握產(chǎn)品運(yùn)營(yíng)動(dòng)態(tài),及時(shí)跟進(jìn)用戶反饋。
Bugly是一款免費(fèi)的三方庫(kù),提供崩潰日志和應(yīng)用更新、運(yùn)營(yíng)統(tǒng)計(jì)等功能,去年應(yīng)用更新功能(全量更新)被割掉了,非常遺憾,但崩潰日志還能正常使用并且做的也很不錯(cuò)。相當(dāng)于它提供后臺(tái)存儲(chǔ),對(duì)于一些NDK之類的底層報(bào)錯(cuò)和代碼混淆可以通過(guò)上傳符號(hào)表查看報(bào)錯(cuò)信息。
在build.gradle文件中添加配置和依賴
android { defaultConfig { // 設(shè)置支持的SO庫(kù)架構(gòu) abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', ndk { 'arm64-v8a' } } } //其中l(wèi)atest.release指代最新Bugly SDK版本號(hào),也可以指定明確的版本號(hào),例如4.0.3 } dependencies { implementation 'com.tencent.bugly:crashreport:latest.release'
盡可能早的初始化
CrashReport.initCrashReport(getApplicationContext(), "注冊(cè)時(shí)申請(qǐng)的APPID", false);
之后出現(xiàn)應(yīng)用異常即可在賬號(hào)內(nèi)查看和處理,可以說(shuō)功能還是比較齊全的。
感謝各位的閱讀,以上就是“Android崩潰日志收集和保存代碼分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Android崩潰日志收集和保存代碼分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。