Android異常と性能最適化のcrash異常処理
3653 ワード
Androidアプリケーションでは、crash、つまりクラッシュが避けられないことがあります.Androidはこのような問題を処理する方法を提供しており、crashが発生すると、UncaughtExceptionメソッドをUncaaughtExceptionHandlerにコールバックします.uncaughtExceptionメソッドでは例外情報を取得できます.例外情報をsdカードに格納し、適切なタイミングでサーバにアップロードすることを選択できます.
実装方法:
<1>クラスCrashHanlder継承UnCaughtExceptionHandlerを作成し、uncaughtExceptionメソッドを実装
<2>アプリケーションのonCreateメソッドで呼び出す
実装方法:
<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);