Android 如何收集已釋出程式的崩潰資訊
阿新 • • 發佈:2018-12-30
class MythouCrashHandler implements UncaughtExceptionHandler
{
private static final String TAG = "MythouCrashHandler---->";
private UncaughtExceptionHandler defaultUEH;
//建構函式,獲取預設的處理方法
public MythouCrashHandler()
{
this.defaultUEH = Thread.getDefaultUncaughtExceptionHandler();
}
//這個介面必須重寫,用來處理我們的異常資訊
@Override
public void uncaughtException(Thread thread, Throwable ex)
{
final Writer result = new StringWriter();
final PrintWriter printWriter = new PrintWriter(result);
//獲取跟蹤的棧資訊,除了系統棧資訊,還把手機型號、系統版本、編譯版本的唯一標示
StackTraceElement[] trace = ex.getStackTrace();
StackTraceElement[] trace2 = new StackTraceElement[trace.length+3];
System.arraycopy(trace, 0, trace2, 0, trace.length);
trace2[trace.length+0] = new StackTraceElement("Android", "MODEL", android.os.Build.MODEL, -1);
trace2[trace.length+1] = new StackTraceElement("Android", "VERSION", android.os.Build.VERSION.RELEASE, -1);
trace2[trace.length+2] = new StackTraceElement("Android", "FINGERPRINT", android.os.Build.FINGERPRINT, -1);
//追加資訊,因為後面會回撥預設的處理方法
ex.setStackTrace(trace2);
ex.printStackTrace(printWriter);
//把上面獲取的堆疊資訊轉為字串,打印出來
String stacktrace = result.toString();
printWriter.close();
Log.e(TAG, stacktrace);
//這裡把剛才異常堆疊資訊寫入SD卡的Log日誌裡面
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
String sdcardPath = Environment.getExternalStorageDirectory().getPath();
writeLog(stacktrace, sdcardPath + "/mythou");
}
defaultUEH.uncaughtException(thread, ex);
}
//寫入Log資訊的方法,寫入到SD卡里面
private void writeLog(String log, String name)
{
CharSequence timestamp = DateFormat.format("yyyyMMdd_kkmmss", System.currentTimeMillis());
String filename = name + "_" + timestamp + ".log";
try
{
FileOutputStream stream = new FileOutputStream(filename);
OutputStreamWriter output = new OutputStreamWriter(stream);
BufferedWriter bw = new BufferedWriter(output);
//寫入相關Log到檔案
bw.write(log);
bw.newLine();
bw.close();
output.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}