Android程序Crash时的异常上报

大家都知道,Android应用不可避免的会发生crash,无论你的程序写的多完美,总是无法完全避免crash的发生,可能是由于android系统底层的bug,也可能是由于不充分的机型适配或者是糟糕的网络状况。当crash发生时,系统会kill掉你的程序,表现就是闪退或者程序已停止运行,这对用户来说是很不友好的,也是开发者所不愿意看到的,更糟糕的是,当用户发生了crash,开发者却无法得知程序为何crash,即便你想去解决这个crash,但是由于你无法知道用户当时的crash信息,所以你也无能为力。

--------------------------------------分割线--------------------------------------

想下载 Android程序Crash时的异常上报 DEMO的可以到Linux公社资源下载

免费下载地址在

用户名与密码都是

具体下载目录在 /2013年资料/12月/14日/Android程序Crash时的异常上报

下载方法见

--------------------------------------分割线--------------------------------------

是否真的这样呢,其实android中有处理这类问题的方法,请看下面Thread类中的一个方法#setDefaultUncaughtExceptionHandler

/**
    * Sets the default uncaught exception handler. This handler is invoked in
    * case any Thread dies due to an unhandled exception.
    *
    * @param handler
    *            The handler to set or null.
    */
    public static void setDefaultUncaughtExceptionHandler(UncaughtExceptionHandler handler) {
        Thread.defaultUncaughtHandler = handler;
    }

从方法的字面意义来看,这个方法好像是可以设置系统的默认异常处理器,其实,这个方法就可以解决应用常见的crash问题。当crash发生的时候,我们可以捕获到异常信息,把异常信息存储到SD卡中,然后在合适的时机通过网络将crash信息上传到服务器上,这样开发人员就可以分析用户crash的场景从而在后面的版本中修复此类crash。我们还可以在crash发生时,弹出一个通知告诉用户程序crash了,然后再退出,这样做比闪退要温和一点。

步骤

1. 建立异常处理Handler

新建一个类,比如叫CrashHandler.java,代码如下,代码我就不做解释了,注释相当清晰了

public class CrashHandler implements UncaughtExceptionHandler {
    private static final String TAG = "CrashHandler";
    private static final boolean DEBUG = true;

private static final String PATH = Environment.getExternalStorageDirectory().getPath() + "/ryg_test/log/";
    private static final String FILE_NAME = "crash";

//log文件的后缀名
    private static final String FILE_NAME_SUFFIX = ".trace";

private static CrashHandler sInstance = new CrashHandler();

//系统默认的异常处理(默认情况下,系统会终止当前的异常程序)
    private UncaughtExceptionHandler mDefaultCrashHandler;

private Context mContext;

//构造方法私有,防止外部构造多个实例,即采用单例模式
    private CrashHandler() {
    }

public static CrashHandler getInstance() {
        return sInstance;
    }

//这里主要完成初始化工作
    public void init(Context context) {
        //获取系统默认的异常处理器
        mDefaultCrashHandler = Thread.getDefaultUncaughtExceptionHandler();
        //将当前实例设为系统默认的异常处理器
        Thread.setDefaultUncaughtExceptionHandler(this);
        //获取Context,方便内部使用
        mContext = context.getApplicationContext();
    }

/**
    * 这个是最关键的函数,当程序中有未被捕获的异常,系统将会自动调用#uncaughtException方法
    * thread为出现未捕获异常的线程,ex为未捕获的异常,有了这个ex,我们就可以得到异常信息。
    */
    @Override
    public void uncaughtException(Thread thread, Throwable ex) {
        try {
            //导出异常信息到SD卡中
            dumpExceptionToSDCard(ex);
            //这里可以通过网络上传异常信息到服务器,便于开发人员分析日志从而解决bug
            uploadExceptionToServer();
        } catch (IOException e) {
            e.printStackTrace();
        }

//打印出当前调用栈信息
        ex.printStackTrace();

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/ab915b2772e3dfa2044cf3017096c6aa.html