Created
July 14, 2016 08:19
-
-
Save plusend/e022bc3e285b35601742c47320aee845 to your computer and use it in GitHub Desktop.
使用 CrashHandler 来获取应用的 crash 信息
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.xxx.utils; | |
import java.io.BufferedWriter; | |
import java.io.File; | |
import java.io.FileWriter; | |
import java.io.IOException; | |
import java.io.PrintWriter; | |
import java.lang.Thread.UncaughtExceptionHandler; | |
import java.text.SimpleDateFormat; | |
import java.util.Date; | |
import java.util.Locale; | |
import java.util.Log; | |
import android.content.Context; | |
import android.content.pm.PackageInfo; | |
import android.content.pm.PackageManager; | |
import android.content.pm.PackageManager.NameNotFoundException; | |
import android.os.Build; | |
import android.os.Environment; | |
import android.os.Process; | |
public class CrashHandler implements UncaughtExceptionHandler { | |
private static final String TAG = "CrashHandler"; | |
private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/xxx/log/"; | |
private static final String FILE_NAME = "crash"; | |
private static final String FILE_NAME_SUFFIX = ".trace"; | |
private static CrashHandler sInstance = new CrashHandler(); | |
private UncaughtExceptionHandler mDefaultCrashHandler; | |
private Context mContext; | |
private CrashHandler() { | |
} | |
public static CrashHandler getInstance() { | |
return sInstance; | |
} | |
public void init(Context context) { | |
mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler(); | |
Thread.setDefaultUncaughtExceptionHandler(this); | |
mContext = context.getApplicationContext(); | |
} | |
/** | |
* 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法 | |
* thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。 | |
*/ | |
@Override | |
public void uncaughtException(Thread thread, Throwable ex) { | |
try { | |
// 导出异常信息到SD卡中 | |
dumpExceptionToSDCard(ex); | |
uploadExceptionToServer(); | |
// 这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
ex.printStackTrace(); | |
// 如果系统提供了默认的异常处理器,则交给系统去结束我们的程序,否则就由我们自己结束自己 | |
if (mDefaultCrashHandler != null) { | |
mDefaultCrashHandler.uncaughtException(thread, ex); | |
} else { | |
Process.killProcess(Process.myPid()); | |
} | |
} | |
private void dumpExceptionToSDCard(Throwable ex) throws IOException { | |
// 如果SD卡不存在或无法使用,则无法把异常信息写入SD卡 | |
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { | |
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", 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); | |
dumpPhoneInfo(pw); | |
pw.println(); | |
ex.printStackTrace(pw); | |
pw.close(); | |
} catch (Exception e) { | |
Log.e(TAG, "dump crash info failed"); | |
} | |
} | |
private void dumpPhoneInfo(PrintWriter pw) throws NameNotFoundException { | |
PackageManager pm = mContext.getPackageManager(); | |
PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES); | |
pw.print("App Version: "); | |
pw.print(pi.versionName); | |
pw.print('_'); | |
pw.println(pi.versionCode); | |
// android版本号 | |
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); | |
// cpu架构 | |
pw.print("CPU ABI: "); | |
pw.println(Build.SUPPORTED_ABIS); | |
} | |
private void uploadExceptionToServer() { | |
// TODO Upload Exception Message To Your Web Server | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add below code in Application's onCreate method.
CrashHandler crashHandler = CrashHandler.getInstance();
crashHandler.init(context);