Android CrashHandler 가 이상 한 캡 처 방법 을 만 듭 니 다.

4471 단어 AndroidCrashHandler
평소에 코드 를 쓰 면 우 리 는 여러 가지 이상 을 던 질 수 있 습 니 다.이런 이상 은 우리 가 테스트 하 는 과정 에서 발견 하여 해결 한 것 입 니 다.그러나 일부 이상 은 우리 가 알 수 없 는 것 입 니 다.코드 의 논리 문제 든 안 드 로 이 드 자체 의 밑바닥 에 있 는 bug 든 우 리 는 모두 시간 에 알 고 해결 해 야 합 니 다.사용자 가 app 을 사용 하여 붕괴 현상 이 발생 했 을 때 우 리 는 어떤 원인 인지 알 고 그 원인 을 서버 에 기록 해 야 합 니 다.그러면 우 리 는 구체 적 으로 어떤 원인 인지 알 수 있 습 니 다.
CrashHandler 클래스
crash 원인 을 기록 하여 sd 카드 에 저장 합 니 다.

public class CrashHandler implements Thread.UncaughtExceptionHandler {
  private static final String TAG = "CrashHandler";
  private static final boolean DEBUG = true;
  //    
  private static final String PATH = Environment.getExternalStorageDirectory().getPath() +File.separator+ "crash";
  private static final String FILE_NAME = "crash";
  private static final String FILE_NAME_SUFEIX = ".trace";
  private static Thread.UncaughtExceptionHandler mDefaultCrashHandler;
  private static CrashHandler mCrashHandler = new CrashHandler();
  private Context mContext;

  private CrashHandler() {
  }

  public static CrashHandler getInstance() {
    return mCrashHandler;
  }

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

  @Override
  public void uncaughtException(Thread thread, Throwable ex) {
    try {
      //     sd 
      writeToSDcard(ex);
      //              
    } catch (IOException e) {
      e.printStackTrace();
    } catch (PackageManager.NameNotFoundException e) {
      e.printStackTrace();
    }
    ex.printStackTrace();
    //                      ,        。
    if (mDefaultCrashHandler != null) {
      mDefaultCrashHandler.uncaughtException(thread, ex);
    } else {
      Process.killProcess(Process.myPid());
    }
  }

  //       
  private void writeToSDcard(Throwable ex) throws IOException, PackageManager.NameNotFoundException {
    //    SD ,    
    if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
      return;
    }
    File filedir = new File(PATH);
    if (!filedir.exists()) {
      filedir.mkdirs();
    }
    long currenttime = System.currentTimeMillis();
    String time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(currenttime));

    File exfile = new File(PATH +File.separator+FILE_NAME+time + FILE_NAME_SUFEIX);
    PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter(exfile)));
    Log.e("        ",""+exfile.getAbsolutePath());
    pw.println(time);
    PackageManager pm = mContext.getPackageManager();
    PackageInfo pi = pm.getPackageInfo(mContext.getPackageName(), PackageManager.GET_ACTIVITIES);
    //     
    pw.println("App Version:" + pi.versionName + "_" + pi.versionCode);
    //    
    pw.println("OS version:" + Build.VERSION.RELEASE + "_" + Build.VERSION.SDK_INT);
    //   
    pw.println("Vendor:" + Build.MANUFACTURER);
    //    
    pw.println("Model:" + Build.MODEL);
    //CPU  
    pw.println("CPU ABI:" + Build.CPU_ABI);

    ex.printStackTrace(pw);
    pw.close();

  }


}
호출

public class BaseApplication extends Application {
  @Override
  public void onCreate() {
    super.onCreate();
    CrashHandler crashHandler=CrashHandler.getInstance();
    crashHandler.init(this);
  }
}
테스트

 mButton.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        throw new RuntimeException("      ");
      }
    });
마지막 으로 파일 권한 을 추가 하고 BaseApplication 을 호출 하 는 것 을 기억 하 십시오.
这里写图片描述  
这里写图片描述
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기