最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android崩潰日志收集和保存解析

 更新時(shí)間:2023年02月27日 14:56:02   作者:似曾相識2022  
這篇文章主要為大家介紹了Android崩潰日志收集和保存解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

面試

記得很久很久以前的一次面試中被面試官問:

面試官:你的崩潰日志是怎么收集的?
我答:集成騰訊的Bugly收集。
面試官:如果不用第三方呢?
我:好像有個(gè)什么異常的handler,具體想不起來了

那么今天我們就來聊聊關(guān)于崩了日志收集的以上兩種方式UncaughtExceptionHandler和Bugly

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()
        ......
}

通過入?yún)tringWriter的PrintWriter獲取到Throwable信息,再將StringWriter的信息打印出來就是應(yīng)用的崩潰信息,獲取過程雖稍顯復(fù)雜但使用還是極其簡單。之后就是將日志保存在本地和上傳服務(wù)器的過程了。

val fos = FileOutputStream(path + fileName)
fos.write(sb.toString().toByteArray())

既然有儲(chǔ)存那么就一定要有刪除功能,否則一旦數(shù)據(jù)量大了后手機(jī)內(nèi)存就不夠用了,我們設(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í)遇到的問題,debug和realase兩個(gè)版本中一個(gè)可以在保存目錄找到日志,一個(gè)根本找不到該目錄。經(jīng)過反復(fù)對比和查找資料才發(fā)現(xiàn),原來是cacheDir和externalCacheDir的區(qū)別,哈哈哈,著實(shí)給我整懵逼了。

Bugly

Bugly

為移動(dòng)開發(fā)者提供專業(yè)的異常上報(bào)和運(yùn)營統(tǒng)計(jì),幫助開發(fā)者快速發(fā)現(xiàn)并解決異常,同時(shí)掌握產(chǎn)品運(yùn)營動(dòng)態(tài),及時(shí)跟進(jìn)用戶反饋。

Bugly是一款免費(fèi)的三方庫,提供崩潰日志和應(yīng)用更新、運(yùn)營統(tǒng)計(jì)等功能,去年應(yīng)用更新功能(全量更新)被割掉了,非常遺憾,但崩潰日志還能正常使用并且做的也很不錯(cuò)。相當(dāng)于它提供后臺(tái)存儲(chǔ),對于一些NDK之類的底層報(bào)錯(cuò)和代碼混淆可以通過上傳符號表查看報(bào)錯(cuò)信息。

在build.gradle文件中添加配置和依賴

android { 
   defaultConfig { 
      // 設(shè)置支持的SO庫架構(gòu) 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(), "注冊時(shí)申請的APPID", false);

之后出現(xiàn)應(yīng)用異常即可在賬號內(nèi)查看和處理,可以說功能還是比較齊全的。

總結(jié)

其實(shí)現(xiàn)在網(wǎng)上很多關(guān)于崩潰日志的庫,啥蒲公英、加固類Sdk都有,最終還是得根據(jù)項(xiàng)目情況選擇一款條件合適得工具。UncaughtExceptionHandler使用也簡單,但需要開發(fā)者自己使用代碼做好日志整理、收集、上傳功能,如果涉及上傳就得需要后端配合,無疑又增加了人員維護(hù),好處就是自己服務(wù)器控制數(shù)據(jù)。三方庫使用就更簡單了,連后端都省了,但因此也帶來了弊端,始終數(shù)據(jù)在別人服務(wù)器中,這個(gè)不可控,如涉及隱私可能也不會(huì)選擇它。

以上就是Android崩潰日志收集和保存解析的詳細(xì)內(nèi)容,更多關(guān)于Android崩潰日志收集保存的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

云梦县| 河北区| 公主岭市| 全南县| 和硕县| 广宗县| 云和县| 开原市| 土默特右旗| 富锦市| 新巴尔虎右旗| 南华县| 青河县| 镇宁| 凌云县| 德清县| 彩票| 山阳县| 六枝特区| 衡南县| 时尚| 漳州市| 华坪县| 庆阳市| 万安县| 辛集市| 长汀县| 桂平市| 前郭尔| 洛阳市| 云南省| 大港区| 通榆县| 屏南县| 山东省| 贡觉县| 昭苏县| 子洲县| 武强县| 达尔| 普陀区|