Android实现自定义事故处理程序记录崩溃信息实例代码

  

  

在使用自己开发的android应用时,偶尔会出现系统已停止运行错误。这时候如果能记录错误日志,是非常有帮助的。

  

应用异常崩溃信息存入文件中。
  

  

应用崩溃时,尽可能的收集多的数据,方便后续定位追踪修改。
  

  

如果可以,尽量将崩溃日志上传到服务器。一些集成服务已经提供了相应的功能。

  

主要使用的方法是线程。UncaughtExceptionHandler
  

  

  

一般在应用程序中启动CrashHandler,个人认为应该放在调用其他模块前尽早启动。

  

CrashHandler.java         进口android.os.Build;   进口android.os.Environment;   进口android.os.Process;   进口java.io.BufferedWriter;   进口java.io.File;   进口java.io.FileWriter;   进口java.io.IOException;   进口java.io.PrintWriter;   进口java.text.SimpleDateFormat;   进口java.util.Date;   进口java.util.Locale;      公共类CrashHandler实现线程。UncaughtExceptionHandler {   私有静态最终字符串标签=癈rashHandler”;   私有静态最终布尔DEBUG=true;//自定义存储的目录   私有静态最终字符串路径=Environment.getExternalStorageDirectory () .getPath () +“myApp/日志/?   私有静态最终字符串FILE_NAME=氨览!?   私有静态最终字符串FILE_NAME_SUFFIX=" . txt ";   私人字符串phoneInfo;   私有静态CrashHandler实例=new CrashHandler ();   私人的线程。UncaughtExceptionHandler mDefaultCrashHandler;      私人CrashHandler () {   }      公共静态CrashHandler getInstance () {   返回实例;   }      公共空间init () {   mDefaultCrashHandler=Thread.getDefaultUncaughtExceptionHandler ();   Thread.setDefaultUncaughtExceptionHandler(这个);   phoneInfo=getPhoneInformation ();   }/* *   *这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用uncaughtException方法   *线程为出现未捕获异常的线程,为交货未捕获的异常,有了这个前女友,我们就可以得到异常信息   */@Override   公共空间uncaughtException(特异)线程的线程,Throwable {   尝试{//导出异常信息到SD卡中   dumpExceptionToSDCard (ex);//这里可以上传异常信息到服务器,便于开发人员分析日志从而解决bug   uploadExceptionToServer ();   }捕捉(IOException e) {   e.printStackTrace ();   }   ex.printStackTrace ();//如果系统提供默认的异常处理器,则交给系统去结束程序,否则就由自己结束自己   如果(mDefaultCrashHandler !=null) {   mDefaultCrashHandler。uncaughtException(线程、交货);   其他}{   尝试{   thread . sleep (2000);//延迟2秒杀进程   }捕捉(InterruptedException e) {   e.printStackTrace ();   }   android.os.Process.killProcess (Process.myPid ());   }   }      私人空白dumpExceptionToSDCard (Throwable的前女友)抛出IOException {//如果SD卡不存在或无法使用,则无法把异常信息写入SD卡   如果(! Environment.getExternalStorageState () .equals (Environment.MEDIA_MOUNTED)) {   如果(调试){   日志。e(标签,sdcard卸载,跳过转储例外);   返回;   }   }   文件dir=新文件(路径);   如果(! dir.exists ()) {   dir.mkdirs ();   }   长电流=System.currentTimeMillis ();   字符串时间=new SimpleDateFormat (“yyyy-MM-dd HH: mm: ss Locale.CHINA)。格式(新日期(当前));   文件文件=新文件(路径+ FILE_NAME +时间+ FILE_NAME_SUFFIX);   尝试{   PrintWriter pw=new PrintWriter(新BufferedWriter(新FileWriter(文件)));   pw.println(时间);   pw.println (phoneInfo);   pw.println ();   ex.printStackTrace (pw);   pw.close ();   日志。e(标签,“倾倒事故信息一站”);   }捕捉(异常e) {   日志。e(标签,e.getMessage ());   日志。e(标签,“倾倒事故信息失败”);   }   }      私人空间uploadExceptionToServer () {//将异常信息发送到服务器   }      私人字符串getPhoneInformation () {   StringBuilder某人=new StringBuilder ();   sb.append(“应用程序版本的名字:”)   .append (BuildConfig.VERSION_NAME)   .append(“版本代码:“)   .append (BuildConfig.VERSION_CODE) .append (“\ n”);//Android版本号   sb.append(“操作系统版本:”);   sb.append (Build.VERSION.RELEASE);   sb.append (“_”);   sb.append (Build.VERSION.SDK_INT) .append (“\ n”);//手机制造商   sb.append(“供应商:”);   sb.append (Build.MANUFACTURER) .append (“\ n”);//手机型号   sb.append(“模型:”);   sb.append (Build.MODEL) .append (“\ n”);//CPU架构   sb.append .append (“CPU ABI:”) (“\ n”);   (字符串abi: Build.SUPPORTED_ABIS) {   sb.append (abi) .append (“\ n”);   }   返回sb.toString ();   }   }

Android实现自定义事故处理程序记录崩溃信息实例代码