網(wǎng)站首頁 編程語言 正文
面試
記得很久很久以前的一次面試中被面試官問:
面試官:你的崩潰日志是怎么收集的?
我答:集成騰訊的Bugly收集。
面試官:如果不用第三方呢?
我:好像有個什么異常的handler,具體想不起來了
那么今天我們就來聊聊關于崩了日志收集的以上兩種方式UncaughtExceptionHandler和Bugly
UncaughtExceptionHandler
- UncaughtExceptionHandler UncaughtExceptionHandler類是java1.5里新增的Thread類里面的一個函數(shù)式接口類的,接口處理器時調(diào)用線程突然終止,由于未捕獲到異常。當一個線程要終止由于未捕獲到異常的Java虛擬機將查詢線程其使用的UncaughtExceptionHandler.getUncaughtExceptionHandler,將調(diào)用處理程序的uncaughtException方法,將線程和異常作為參數(shù)。
首先我們需要編寫該接口實現(xiàn)類,重寫uncaughtException方法,一旦應用發(fā)生異常該方法就會觸發(fā),所以我們的業(yè)務邏輯就必須在這個接口中實現(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的信息打印出來就是應用的崩潰信息,獲取過程雖稍顯復雜但使用還是極其簡單。之后就是將日志保存在本地和上傳服務器的過程了。
val fos = FileOutputStream(path + fileName)
fos.write(sb.toString().toByteArray())
既然有儲存那么就一定要有刪除功能,否則一旦數(shù)據(jù)量大了后手機內(nèi)存就不夠用了,我們設置一個清除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)//截取時間戳
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兩個版本中一個可以在保存目錄找到日志,一個根本找不到該目錄。經(jīng)過反復對比和查找資料才發(fā)現(xiàn),原來是cacheDir和externalCacheDir的區(qū)別,哈哈哈,著實給我整懵逼了。
Bugly
Bugly
為移動開發(fā)者提供專業(yè)的異常上報和運營統(tǒng)計,幫助開發(fā)者快速發(fā)現(xiàn)并解決異常,同時掌握產(chǎn)品運營動態(tài),及時跟進用戶反饋。
Bugly是一款免費的三方庫,提供崩潰日志和應用更新、運營統(tǒng)計等功能,去年應用更新功能(全量更新)被割掉了,非常遺憾,但崩潰日志還能正常使用并且做的也很不錯。相當于它提供后臺存儲,對于一些NDK之類的底層報錯和代碼混淆可以通過上傳符號表查看報錯信息。
在build.gradle文件中添加配置和依賴
android {
defaultConfig {
// 設置支持的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(), "注冊時申請的APPID", false);
之后出現(xiàn)應用異常即可在賬號內(nèi)查看和處理,可以說功能還是比較齊全的。
總結(jié)
其實現(xiàn)在網(wǎng)上很多關于崩潰日志的庫,啥蒲公英、加固類Sdk都有,最終還是得根據(jù)項目情況選擇一款條件合適得工具。UncaughtExceptionHandler使用也簡單,但需要開發(fā)者自己使用代碼做好日志整理、收集、上傳功能,如果涉及上傳就得需要后端配合,無疑又增加了人員維護,好處就是自己服務器控制數(shù)據(jù)。三方庫使用就更簡單了,連后端都省了,但因此也帶來了弊端,始終數(shù)據(jù)在別人服務器中,這個不可控,如涉及隱私可能也不會選擇它。
原文鏈接:https://juejin.cn/post/7204471780140810295
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-04-10 C#實現(xiàn)泛型動態(tài)循環(huán)數(shù)組隊列的方法_C#教程
- 2022-06-09 詳解C++?functional庫中的仿函數(shù)使用方法_C 語言
- 2022-06-14 GO語言結(jié)構(gòu)體面向?qū)ο蟛僮魇纠齙Golang
- 2022-04-05 老生常談Python中的Pickle庫_python
- 2022-03-10 .NET6一些常用組件的配置及使用_基礎應用
- 2022-10-22 Python?NumPy教程之數(shù)組的創(chuàng)建詳解_python
- 2022-11-02 python?pip特殊用法之pip?install?-v?-e?.命令詳解_python
- 2021-12-16 .NET中的狀態(tài)機庫Stateless的操作流程_實用技巧
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支