Android異常と性能最適化のcrash異常処理

3653 ワード

Androidアプリケーションでは、crash、つまりクラッシュが避けられないことがあります.Androidはこのような問題を処理する方法を提供しており、crashが発生すると、UncaughtExceptionメソッドをUncaaughtExceptionHandlerにコールバックします.uncaughtExceptionメソッドでは例外情報を取得できます.例外情報をsdカードに格納し、適切なタイミングでサーバにアップロードすることを選択できます.
実装方法:
<1>クラスCrashHanlder継承UnCaughtExceptionHandlerを作成し、uncaughtExceptionメソッドを実装
 public class CrashHandler implements Thread.UncaughtExceptionHandler {

     private static CrashHandler crashHandler;
     private Context context;
     private Thread.UncaughtExceptionHandler mDefaultCrashHandler;
     private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/crash/log/";
     private static final String FILE_NAME = "crash";
     private static final String FILE_NAME_SUFFIX = ".trace";

     public static CrashHandler getInstance(){

         if(crashHandler == null){
             crashHandler = new CrashHandler();
         }
         return crashHandler;
     }

     public void init(Context context){
         context = context.getApplicationContext();
         //           
         Thread.setDefaultUncaughtExceptionHandler(this);
         mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
     }

     @Override
     public void uncaughtException(Thread t, Throwable e) {
         try {
             //        SD  
             dumpExceptionToSDCard(e);
//               //          ,        
//               uploadExceptionToServer();
         }catch (Exception e1){
             e1.printStackTrace();
         }
         e.printStackTrace();
         
		 if(mDefaultCrashHandler != null){
             mDefaultCrashHandler.uncaughtException(t,e);
         }else{
             Process.killProcess(Process.myPid());
         }

     }

     private void dumpExceptionToSDCard(Throwable ex) throws Exception{
         //  SD          ,           
         if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
             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);
         if(!file.exists()){
             file.createNewFile();
         }
     PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(file)));
     pw.println(time);
     dumpPhoneInfo(pw);
     pw.println();
     ex.printStackTrace(pw);
    }

     private void dumpPhoneInfo(PrintWriter pw) throws PackageManager.NameNotFoundException {
         PackageManager pm = context.getPackageManager();
         PackageInfo pi = pm.getPackageInfo(context.getPackageName(),PackageManager.GET_ACTIVITIES);
         pw.println("APP Version");
         pw.println(pi.versionName);
         pw.println("_");
         pw.println(pi.versionCode);

         //Android   
         pw.println("OS Version: ");
         pw.println(Build.VERSION.RELEASE);
         pw.println("_");
         pw.println(Build.VERSION.SDK_INT);

         //     
         pw.println("Vendor:");
         pw.println(Build.MANUFACTURER);

         //   
         pw.println("Model:");
         pw.println(Build.MODEL);

         //CPU  
         pw.println("CPU ABI:");
         pw.println(Build.CPU_ABI);
     }
 }	

<2>アプリケーションのonCreateメソッドで呼び出す
     CrashHandler crashHandler = CrashHandler.getInstance();
	 crashHandler.init(this);