您好,登錄后才能下訂單哦!
前言
在使用自己開發的android應用時,偶爾會出現 系統已停止運行 錯誤.這時候如果能記錄錯誤日志,是非常有幫助的。
App異常崩潰信息存入文件中。
應用崩潰時,盡可能的收集多的數據,方便后續定位追蹤修改。
如果可以,盡量將崩潰日志上傳到服務器。一些集成服務已經提供了相應的功能。
主要使用的方法是Thread.UncaughtExceptionHandler
方法如下
一般在application中啟動CrashHandler,個人認為應該放在調用其他模塊前盡早啟動。
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(); } /** * 這個是最關鍵的函數,當程序中有未被捕獲的異常,系統將會自動調用uncaughtException方法 * thread為出現未捕獲異常的線程,ex為未捕獲的異常,有了這個ex,我們就可以得到異常信息 */ @Override public void uncaughtException(Thread thread, Throwable ex) { try { //導出異常信息到SD卡中 dumpExceptionToSDCard(ex); //這里可以上傳異常信息到服務器,便于開發人員分析日志從而解決bug uploadExceptionToServer(); } catch (IOException e) { e.printStackTrace(); } ex.printStackTrace(); //如果系統提供默認的異常處理器,則交給系統去結束程序,否則就由自己結束自己 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() { // 將異常信息發送到服務器 } 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架構 sb.append("CPU ABI:").append("\n"); for (String abi : Build.SUPPORTED_ABIS) { sb.append(abi).append("\n"); } return sb.toString(); } }
使用方式,可在Application中調用初始化方法
@Override public void onCreate() { super.onCreate(); // init application... CrashHandler.getInstance().init(); }
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。