您的位置:首页 > 移动开发 > Android开发

Android---Crash三部曲---收集

2017-01-17 17:24 162 查看
通过CrashHandler来监视应用的crash信息,给程序设置野鬼CrashHandler,这样当程序crash时就会调用CrashHandler的uncaughtException方法.在这个方法中我们可以获取crash信息并上传到服务器

public class CrashHandler implements Thread.UncaughtExceptionHandler {
private static final String TAG = "CrashHandler";
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 getsInstance(){
return sInstance;
}
public void init(Context context){
mDefaultCrashHandler=Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
mContext=context.getApplicationContext();
Log.e("------","执行了 CrashHandler");
}
//这里是最关键的方法,当层序中有未捕获的异常时.系统将会自动调用 uncaughtException这个方法
@Override
public void uncaughtException(Thread thread, Throwable ex) {
//Thread    为未捕获异常的线程
//Throwable 为未捕获的异常

//如果系统提供了默认的异常处理器,就交给系统区结束程序,否则就自己结束自己
if (mDefaultCrashHandler!=null){ //判断系统提供了默认的异常处理器没有 如果不为空就是有
mDefaultCrashHandler.uncaughtException(thread,ex);
}else {
Process.killProcess(Process.myPid());
}
Log.e("------","执行了 CrashHandler");
}
private void dumpExceptionToSDCard (Throwable ex)throws  IOException{
//如果SD卡不存在或者无法使用,则无法把异常写入在SD卡中
if (!Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED)){
if (DEBUG){
Log.w(TAG,"SDCard 出现异常 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);
Log.e("------","执行了 CrashHandler");
try {
//向文本输出流.一种过滤流,也叫处理流
PrintWriter pw=new PrintWriter(new BufferedWriter(new FileWriter(file)));
pw.println(time);
dumpPhoneInfo(pw);
pw.println();
ex.printStackTrace(pw);
pw.close();
} catch (IOException e) {
Log.e(TAG,"dump crash info failed");
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
}

private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {
PackageManager pm=mContext.getPackageManager();
PackageInfo pi=pm.getPackageInfo(
mContext.getPackageName(),PackageManager.GET_ACTIVITIES);
pw.print("AppVersion: ");
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.CPU_ABI);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Crash