代码:android崩溃日志收集和处理
用来处理android崩溃日志收集的代码,详情的使用请转:android崩溃日志收集和处理
第一个类
/**
* 异常捕捉实现类
*/
public class ErrorCaughtimplements Thread.UncaughtExceptionHandler {
private ErrorHandleerrHandle;
//设置本程序的异常崩溃由此类处理
public ErrorCaught(Application context){
Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
errHandle =new ErrorHandle(context , uncaughtExceptionHandler);
Thread.setDefaultUncaughtExceptionHandler(this);
}
//异常崩溃发生时调用的方法,这里面开始我们想要的操作,包括日志的手机和上传等
@Override
public void uncaughtException(Thread thread, Throwable throwable) {
errHandle.excute(thread, throwable);
}
}
第二个类
/**
* 异常具体处理类
*/
public class ErrorHandle {
private Contextcontext;
private Thread.UncaughtExceptionHandleruncaughtExceptionHandler;
private FilecrashFile;
//新建的时候,随即的开始建造崩溃文件夹和崩溃文件
public ErrorHandle(Application context, Thread.UncaughtExceptionHandler uncaughtExceptionHandler) {
this.context = context;
this.uncaughtExceptionHandler = uncaughtExceptionHandler;
if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
File file =new File(Environment.getExternalStorageDirectory(),"crashCollection");
if (!file.exists()) {
file.mkdirs();//创建崩溃捕捉所在文件夹
}
crashFile =new File(file, getCrashFileName());
if (!crashFile.exists()) {
try {
crashFile.createNewFile();//创建崩溃捕捉文件
}catch (IOException e) {
e.printStackTrace();
}
}
}
}
//用来执行崩溃时具体的操作
public void excute(Thread thread, Throwable throwable) {
CrashInforMationDetail crashInforMationDetail = CrashInforMationDetail.produce(throwable, thread,context);
crashInforMationDetail.writeToFile(crashFile);
signOut(thread, throwable);
}
//强制退出软件
public void signOut(Thread thread, Throwable throwable) {
if (uncaughtExceptionHandler !=null) {
uncaughtExceptionHandler.uncaughtException(thread, throwable);
}else {
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
}
}
//获取崩溃文件名称,具体是年月日组成的文件名
private String getCrashFileName() {
StringBuilder stringBuilder =new StringBuilder();
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int date = calendar.get(Calendar.DATE);
stringBuilder.append("crash_");
stringBuilder.append(year +"-");
stringBuilder.append(month +"-");
stringBuilder.append(date);
stringBuilder.append(".txt");
return stringBuilder.toString();
}
}
第三个类
/**
* 获取崩溃日志的具体内容,这里做了两个处理,一个是错误信息输入文件,一个是把错误信息变成字符串
*/
public class CrashInforMationDetail {
private static StringcrashInfor;//崩溃日志的具体内容
private CrashInforMationDetail() {
}
//获取错误等信息
public static CrashInforMationDetail produce(Throwable throwable, Thread thread, Context context) {
ByteArrayOutputStream out =new ByteArrayOutputStream();
PrintStream print =new PrintStream(out);
out.toString();
print.append("crahtime:" + System.currentTimeMillis()).append("\n");
print.append(getSysytemInfor());
print.append("theadName:" + thread.getName() +"\n").append("threadID:" + thread.getId() +"\n");
crashInfor =getSysytemInfor() +"threadName:" + thread.getName() +"\n" +"threadID:" + thread.getId() +"\n" +"ErrorInformation:" + throwable.getMessage();
print.append(throwable.getMessage()).append("\n");
StackTraceElement[] stackTrace = throwable.getStackTrace();
try {
for (int i =0; i < stackTrace.length; i++) {
StackTraceElement stackTraceElement = stackTrace[i];
String trace = stackTraceElement.toString();
print.append(trace +"\n");
crashInfor += trace +"\n";
}
}catch (Exception e) {
e.printStackTrace();
}
Log.d("crashInfor",crashInfor);
throwable.printStackTrace(print);
return new CrashInforMationDetail();
}
//把错误信息填充进崩溃文件中
public void writeToFile(File file) {
PrintWriter printer =null;
try {
BufferedOutputStream out =new BufferedOutputStream(new FileOutputStream(file,true));
printer =new PrintWriter(out);
printer.println(crashInfor);
printer.flush();
}catch (IOException e) {
e.printStackTrace();
}finally {
if (printer !=null) {
printer.close();
}
}
}
//获取手机的一些设备参数
public static String getSysytemInfor() {
StringBuffer sb =new StringBuffer();
sb.append("主板:" + Build.BOARD +"\n");
sb.append("系统启动程序版本号:" + Build.BOOTLOADER +"\n");
sb.append("系统定制商:" + Build.BRAND +"\n");
sb.append("cpu指令集:" + Build.CPU_ABI +"\n");
sb.append("cpu指令集2:" + Build.CPU_ABI2 +"\n");
sb.append("设置参数:" + Build.DEVICE +"\n");
sb.append("显示屏参数:" + Build.DISPLAY +"\n");
sb.append("无线电固件版本:" + Build.getRadioVersion() +"\n");
sb.append("硬件识别码:" + Build.FINGERPRINT +"\n");
sb.append("硬件名称:" + Build.HARDWARE +"\n");
sb.append("HOST:" + Build.HOST +"\n");
sb.append("修订版本列表:" + Build.ID +"\n");
sb.append("硬件制造商:" + Build.MANUFACTURER +"\n");
sb.append("版本:" + Build.MODEL +"\n");
sb.append("硬件序列号:" + Build.SERIAL +"\n");
sb.append("手机制造商:" + Build.PRODUCT +"\n");
sb.append("描述Build的标签:" + Build.TAGS +"\n");
sb.append("TIME:" + Build.TIME +"\n");
sb.append("builder类型:" + Build.TYPE +"\n");
sb.append("USER:" + Build.USER +"\n");
return sb.toString();
}
public String getString() {
return crashInfor;
}
}