溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android崩潰日志收集和保存代碼分析

發(fā)布時(shí)間:2023-02-27 15:46:41 來(lái)源:億速云 閱讀:125 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“Android崩潰日志收集和保存代碼分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Android崩潰日志收集和保存代碼分析”吧!

UncaughtExceptionHandler

  • 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

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崩潰日志收集和保存代碼分析

感謝各位的閱讀,以上就是“Android崩潰日志收集和保存代碼分析”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Android崩潰日志收集和保存代碼分析這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI