天天看點

編寫日志工具類與崩潰日志采集類

Log列印日志相信每一位開發者都不會陌生吧,平時調試必不可少, 當應用打包給測試測試時。測試回報應用crash的時候,我們第一件 想到的事就是讓對方提供日志。說到這個打Log,很多童鞋喜歡随手 一個Log.e(xxx,xxx),什麼日志都是Error級别,原因基本是: 紅色比較醒目,哈哈!然後直接把變量的值列印處理啊,或在某個 方法裡加上,驗證方法是否執行了等,正式釋出的收記得删還好, 不記得删的話簡直是作死。反正之前給上家公司的大佬噴了一頓, 至今記憶猶新!Log的管理非常重要,我們要寫的兩個工具類如下:

  • 1.debug的時候日志正常列印,release的時候不列印
  • 2.奔潰日志采集,自己測試或者測試測試倒沒什麼,崩潰了直接把 手機接你電腦上看看logcat就一清二楚了,但是如果應用裝到了使用者 手機裡,應用崩潰停止運作了,使用者可不會把日志發給你,多次崩潰 還可能導緻使用者解除安裝你的APP,是以我們需要在APP崩潰的時候把 日志儲存起來,當使用者連接配接wifi或再次打開應用時,把這個日志上傳 到我們的伺服器,我們這裡隻是寫來玩玩的,是以隻做本地崩潰日志采集, 一般都是通過內建第三方的統計工具來進行日志采集的,比如友盟,Bugly等。

好的,需求就上面的兩點,接着準備開始編寫代碼,不過在寫代碼之前 科普關于Log的兩點,可能大部分的童鞋都已經知道了,知道的可以直接跳過:

1) 快速列印Log

打開設定,依次點選:Live Templates -> AndroidLog把日志列印的都勾上 你還可以自己在下面的Template text裡編寫模闆~

編寫日志工具類與崩潰日志采集類

接着随便代碼裡鍵入上面的log...一個enter,Log語句就出來了, TAG直接就是你目前的方法名~

編寫日志工具類與崩潰日志采集類

2.關于Log的使用科普

1) 快速列印Log列印指令

打開Settings,依次點選:Live Templates -> AndroidLog把日志列印的都勾上 你也可以自己在下面的Template text裡編寫模闆~

編寫日志工具類與崩潰日志采集類

接着随便代碼裡鍵入上面的log...一個enter,Log語句就出來了~

編寫日志工具類與崩潰日志采集類
編寫日志工具類與崩潰日志采集類

如果你在方法外,鍵入logt,可以直接生成一個對應類名的TAG:

編寫日志工具類與崩潰日志采集類
編寫日志工具類與崩潰日志采集類

2) Log等級的科普

以前組長開小會的時候曾說過我們調試時直接Log.e的壞習慣, 不同的Log級别應該列印不同的資訊:

  • Log.v:Verbose(冗長) 開發調試過程中一些詳細資訊,不該編譯進産品,隻在開發階段使用
  • Log.d:Debug(調試) 用于調試的資訊,編譯進産品,運作時關閉。
下面這三種等級進制作為普通調試資訊使用,這些等級的Log是應用 出現問題時候的重要分析線索,如果随意使用,會給開發人員分析Bug 帶來不必要的困擾。
  • Log.i:Info(資訊) 例如一些運作時的狀态資訊,這些狀态資訊在出現問題的時候能提供幫助。
  • Log.w:Warning(警告) 警告應用出現了異常,但不一定會馬上出現錯誤,需要留意
  • Log.e:Error(錯誤) 應用出現了錯誤,最需要關注解決的!

3) 編寫日志工具類

老規矩,先開辟分支:buglogcatch 這個就非常簡單了,調試時輸出,正式版時不輸出,利用BuildConfig.Debug 進行判斷即可,代碼如下:

編寫日志工具類與崩潰日志采集類

4) 編寫崩潰日志采集類

崩潰日志采集類依賴于Application與Thread.UncaughtExceptionHandler實作~ 當因為程式因為未捕獲的異常即将終止退出時,會使用Thread.UncaughtExceptionHandler 查詢UncaughtExceptionHandler的線程,調用uncaughtException方法,将線程 與異常作為參數傳遞。如果線程沒有明确設定UncaughtExceptionHandler,則将 其ThreadGroup作為其UncaughtExceptionHandler,然後丢給預設的未捕獲異常 處理程式處理。是以我們隻需要實作UncaughtExceptionHandler接口,重寫 uncaughtException方法,來實作我們的自定義處理。我們先來捋一捋邏輯清單:

  • 1.建一個檔案夾專門放日志檔案:需要判斷是存儲卡是否可用,然後判斷檔案 夾是否存在,不存在則建立檔案夾;
  • 2.需要一個把字元串寫入檔案的方法
  • 3.崩潰日志的内容組成:目前的時間,應用版本,裝置資訊,奔潰日志
  • 4.擷取系統預設的UncaughtException處理器,然後判斷是否為null,不為空 設定為自定義的UncaughtException,這裡我們用單例
  • 5.最後是應用的重新開機,設定1s後重新啟動應用;

大概邏輯就是上面這些,我們一步步講,首先是1,2步:

編寫日志工具類與崩潰日志采集類

接着是奔潰日志,由幾部分組成:先是目前時間

編寫日志工具類與崩潰日志采集類

接着是應用版本以及裝置資訊,這裡用一個HashMap來存:

編寫日志工具類與崩潰日志采集類

在接着是異常資訊,這個就簡單啦,直接傳異常對象,調printStackTrace即可 最後合到一起就是:

編寫日志工具類與崩潰日志采集類

寫入檔案的也解決了,然後是自定義UncaughtExceptionHandler單例以及預設 UncaughtExceptionHandler處理器的擷取,設定為自定義UncaughtExceptionHandler, 還需重寫UncaughtException方法

編寫日志工具類與崩潰日志采集類

接着我們把自己處理異常的一整套都寫到一個方法裡,當異常發生了,彈出 一個Toast提示使用者應用要重新開機,還有調用寫入日志的方法:

編寫日志工具類與崩潰日志采集類

然後重寫的UncaughtException方法做下判斷,是否通過自定義處理了異常, 以及預設的UncaughtExceptionHandler的是否為空,即:異常處理了沒? 沒處理,丢給自定義的UncaughtExceptionHandler,如果處理了,重新開機應用。

編寫日志工具類與崩潰日志采集類

最後加上重新開機應用的相關代碼,大功告成:

編寫日志工具類與崩潰日志采集類

到此我們的崩潰日志采集工具類就編寫完畢了,要啟用他的 話需要在DrySisterApp.java中的onCreate()方法中加上:

編寫日志工具類與崩潰日志采集類

弄完想測試下是否生效的話很簡單,手動引發崩潰就好了 比如我在下一步的按鈕裡做除數為0的操作:

編寫日志工具類與崩潰日志采集類

應用運作後點選下一步,直接崩潰,打開内置存儲根目錄看下 有沒有Crash的檔案夾,打開看到我們日志檔案的話,說明成功:

編寫日志工具類與崩潰日志采集類
編寫日志工具類與崩潰日志采集類