Android實現(xiàn)自定義Crash handler記錄崩潰信息實例代碼
前言
在使用自己開發(fā)的android應用時,偶爾會出現(xiàn) 系統(tǒng)已停止運行 錯誤.這時候如果能記錄錯誤日志,是非常有幫助的。
App異常崩潰信息存入文件中。
應用崩潰時,盡可能的收集多的數(shù)據(jù),方便后續(xù)定位追蹤修改。
如果可以,盡量將崩潰日志上傳到服務器。一些集成服務已經(jīng)提供了相應的功能。
主要使用的方法是Thread.UncaughtExceptionHandler
方法如下
一般在application中啟動CrashHandler,個人認為應該放在調(diào)用其他模塊前盡早啟動。
CrashHandler.java
import android.os.Build;
import android.os.Environment;
import android.os.Process;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "CrashHandler";
private static final boolean DEBUG = true;
// 自定義存儲的目錄
private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/myApp/log/";
private static final String FILE_NAME = "crash";
private static final String FILE_NAME_SUFFIX = ".txt";
private String phoneInfo;
private static CrashHandler instance = new CrashHandler();
private Thread.UncaughtExceptionHandler mDefaultCrashHandler;
private CrashHandler() {
}
public static CrashHandler getInstance() {
return instance;
}
public void init() {
mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
phoneInfo = getPhoneInformation();
}
/**
* 這個是最關鍵的函數(shù),當程序中有未被捕獲的異常,系統(tǒng)將會自動調(diào)用uncaughtException方法
* thread為出現(xiàn)未捕獲異常的線程,ex為未捕獲的異常,有了這個ex,我們就可以得到異常信息
*/
@Override
public void uncaughtException(Thread thread, Throwable ex) {
try {
//導出異常信息到SD卡中
dumpExceptionToSDCard(ex);
//這里可以上傳異常信息到服務器,便于開發(fā)人員分析日志從而解決bug
uploadExceptionToServer();
} catch (IOException e) {
e.printStackTrace();
}
ex.printStackTrace();
//如果系統(tǒng)提供默認的異常處理器,則交給系統(tǒng)去結(jié)束程序,否則就由自己結(jié)束自己
if (mDefaultCrashHandler != null) {
mDefaultCrashHandler.uncaughtException(thread, ex);
} else {
try {
Thread.sleep(2000); // 延遲2秒殺進程
} catch (InterruptedException e) {
e.printStackTrace();
}
android.os.Process.killProcess(Process.myPid());
}
}
private void dumpExceptionToSDCard(Throwable ex) throws IOException {
//如果SD卡不存在或無法使用,則無法把異常信息寫入SD卡
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (DEBUG) {
Log.e(TAG, "sdcard unmounted,skip dump exception");
return;
}
}
File dir = new File(PATH);
if (!dir.exists()) {
dir.mkdirs();
}
long current = System.currentTimeMillis();
String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA).format(new Date(current));
File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);
try {
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
pw.println(time);
pw.println(phoneInfo);
pw.println();
ex.printStackTrace(pw);
pw.close();
Log.e(TAG, "dump crash info seccess");
} catch (Exception e) {
Log.e(TAG, e.getMessage());
Log.e(TAG, "dump crash info failed");
}
}
private void uploadExceptionToServer() {
// 將異常信息發(fā)送到服務器
}
private String getPhoneInformation() {
StringBuilder sb = new StringBuilder();
sb.append("App version name:")
.append(BuildConfig.VERSION_NAME)
.append(", version code:")
.append(BuildConfig.VERSION_CODE).append("\n");
//Android版本號
sb.append("OS Version: ");
sb.append(Build.VERSION.RELEASE);
sb.append("_");
sb.append(Build.VERSION.SDK_INT).append("\n");
//手機制造商
sb.append("Vendor: ");
sb.append(Build.MANUFACTURER).append("\n");
//手機型號
sb.append("Model: ");
sb.append(Build.MODEL).append("\n");
//CPU架構(gòu)
sb.append("CPU ABI:").append("\n");
for (String abi : Build.SUPPORTED_ABIS) {
sb.append(abi).append("\n");
}
return sb.toString();
}
}
使用方式,可在Application中調(diào)用初始化方法
@Override
public void onCreate() {
super.onCreate();
// init application...
CrashHandler.getInstance().init();
}
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Android將Glide動態(tài)加載不同大小的圖片切圓角與圓形的方法
這篇文章主要給大家介紹了關于Android如何將Glide動態(tài)加載不同大小的圖片切圓角與圓形的方法,文中通過示例代碼介紹的非常吸納關系,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧。2017-11-11
Android應用開發(fā)中控制反轉(zhuǎn)IoC設計模式使用教程
這篇文章主要介紹了Android應用開發(fā)中控制反轉(zhuǎn)IoC設計模式使用教程,IoC其實更常被理解為一種依賴注入的模式,用來分解業(yè)務層降低耦合,需要的朋友可以參考下2016-04-04
Android保存的文件顯示到文件管理的最近文件和下載列表中的方法
這篇記錄的是Android中如何把我們往存儲中寫入的文件,如何顯示到文件管理的下載列表、最近文件列表中,需要的朋友可以參考下2020-01-01
Android開發(fā)實現(xiàn)webview中img標簽加載本地圖片的方法
這篇文章主要介紹了Android開發(fā)實現(xiàn)webview中img標簽加載本地圖片的方法,結(jié)合實例形式分析了webview加載本地圖片的步驟與相關操作技巧,需要的朋友可以參考下2017-10-10
Android Vibrator調(diào)節(jié)震動代碼實例
這篇文章主要介紹了Android Vibrator調(diào)節(jié)震動代碼實例,本文直接給出實現(xiàn)代碼,代碼中包含詳細注釋,需要的朋友可以參考下2015-05-05
Android開發(fā)實現(xiàn)撥打電話與發(fā)送信息的方法分析
這篇文章主要介紹了Android開發(fā)實現(xiàn)撥打電話與發(fā)送信息的方法,結(jié)合實例形式分析了Android撥打電話及發(fā)送信息相關布局、功能實現(xiàn)及權(quán)限控制操作技巧,需要的朋友可以參考下2017-12-12

