用来处理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;

}

}

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐