1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
| 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() + "/CrashTest/log/"; private static final String FILE_NAME = "crash"; private static final String FILE_NAME_SUFFIX = ".trace";
private static CrashHandler sInstance = new CrashHandler(); private Thread.UncaughtExceptionHandler mDefaultCrashHandler; private Context mContext;
private CrashHandler() { }
public static CrashHandler getInstance() { return sInstance; }
public void init(Context context) { mContext = context.getApplicationContext(); mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); }
@Override public void uncaughtException(Thread t, Throwable e) { try { dumpExceptionToSDCard(e); uploadExceptionToServer(); } catch (IOException e1) { e1.printStackTrace(); }
if (mDefaultCrashHandler != null) { mDefaultCrashHandler.uncaughtException(t, e); } else { Process.killProcess(Process.myPid()); }
}
private void dumpExceptionToSDCard(Throwable t) throws IOException { if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { if (DEBUG) { Log.w(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").format(new Date(current)); File file = new File(PATH + FILE_NAME + time + FILE_NAME_SUFFIX);
try { PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(file))); printWriter.println(time); dumpPhoneInfo(printWriter); printWriter.println(); t.printStackTrace(printWriter); printWriter.close(); } catch (PackageManager.NameNotFoundException e) { Log.e(TAG, "dump crash info failed "); e.printStackTrace(); } }
private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException { PackageManager manager = mContext.getPackageManager(); PackageInfo pi = manager.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES); pw.print("App Version: "); pw.print(pi.versionName); pw.print("_"); pw.println(pi.versionCode);
pw.print("OS Version: "); pw.print(Build.VERSION.RELEASE); pw.print("_"); pw.println(Build.VERSION.SDK_INT);
pw.print("Vendor: "); pw.println(Build.MANUFACTURER);
pw.print("Model: "); pw.println(Build.MODEL);
pw.print("CPU ABI: "); pw.println(Build.CPU_ABI); }
private void uploadExceptionToServer() { } }
|