Android開発における優れたアプリ異常処理メカニズム


良いアプリ異常処理の仕組みは、少なくとも以下のいくつかの機能が含まれていると思います。
1.エラー情報をサーバにアップロードできます。  開発者がアプリを持続的に改善できるようにする。
2.エラー情報は、少なくともメインプロセスがメインスレッドにあるかどうかなど、プログラマの位置付けを助けることができる情報を含むべきである。
3.携帯のハードウェアとソフトウェアの情報が含まれているほうがいいです。
4.メインプロセスに起因する異常は、システム自身で処理したほうがいいです。つまり、ユーザーにそのようなことを感知させることができます。
5.サブプロセスに起因する異常は、ユーザーに感知されないことが望ましい。例えば、プッシュなどのユーザー感知の弱さとの関連があるということです。異常が発生したらそのままキルオフすればいいです。システムに任せないでください。
コードを下にします。

package com.example.administrator.exceptiontest;

import android.app.ActivityManager;
import android.app.Application;
import android.content.Context;

/**
 * Created by Administrator on 2015/12/9.
 */
public class BaseApplication extends Application {

  public static Context mContext;
  //       
  public static Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler;

  @Override
  public void onCreate() {
    super.onCreate();
    mContext = this;
    //          handler
    defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler(new BaseUncaughtExceptionHandler());
  }


}


package com.example.administrator.exceptiontest;

import android.app.ActivityManager;
import android.content.Context;
import android.os.Looper;

/**
 * Created by Administrator on 2015/12/9.
 */
public class Utils {

  /**
   *                  true     false
   */
  public static boolean isInMainThread() {
    //                 myLooper          thread         
    //   mylooper       null ,               
    return Looper.myLooper() == Looper.getMainLooper();
  }


  //                true     false
  public static boolean isMainProcess(Context context)
  {
    return context.getPackageName().equals(getProcessName(context));
  }

  //     
  public static String getProcessName(Context context) {
    String currentProcessName = "";
    int pid = android.os.Process.myPid();
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
      if (processInfo.pid == pid) {
        currentProcessName = processInfo.processName;
        break;
      }
    }
    return currentProcessName;
  }

}


package com.example.administrator.exceptiontest;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
/**
 * Created by Administrator on 2015/12/9.
 */
public class BaseUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
  @Override
  public void uncaughtException(Thread thread, Throwable ex) {
    Writer resultWriter = new StringWriter();
    PrintWriter printWriter = new PrintWriter(resultWriter);
    ex.printStackTrace(printWriter);
    StringBuffer sb = new StringBuffer();
    sb.append("           " + Utils.isInMainThread() + "
"); sb.append(" " + Utils.isMainProcess(BaseApplication.mContext) + "
"); String errorReport = sb.toString() + resultWriter.toString(); // 。 // 。 , // dialog if (Utils.isMainProcess(BaseApplication.mContext)) { BaseApplication.defaultUncaughtExceptionHandler.uncaughtException(thread, ex); } else { // ⒌ M e android.os.Process.killProcess(android.os.Process.myPid()); } } }