Android关于全局异常捕获及发送到服务器

原创 2015年07月07日 09:43:53

在做项目的过程中,出现异常是在所难免的,Android开发也难逃一劫。
搞过Android开发的朋友都知道,只要程序中出现有异常情况,如果没有对异常进行处理,那么整个应用程序都会出现崩溃的现象。如果是在调试的阶段出现崩溃现象到是没有什么大问题,因为你可以通过控制台打印出异常信息,进而修改代码,避免异常。可是,如果产品已经上线了,用户在使用过程中出现崩溃,这时候你应该怎么办呢?直接找客户看异常信息?不可能,因为你没有对异常信息进行捕获,一崩溃就什么都“消失”了。还有,假设你对捕获了异常信息,把异常信息想写到了sd卡里面,但是出现问题的手机是在用户手上,出现异常你就找客户,让他去他手机上的SD卡查看异常信息,然后再告诉你哪里出现了问题。我说兄弟,你不要指望每个用户都是程序员!
好了,面对以上出现的问题,我们应该如何解决呢?
一、进行全局异常捕获
二、将异常信息写入SD卡
三、程序崩溃了就无法访问网络了,故当再次启动应用程序时,将写到SD卡里面的异常信息读取出来,然后发送到服务器。这样开发人员就可以看到用户手机上出现的异常情况了

可是摆在面前的一个问题,如何全局捕获异常信息?
步骤:
1.定义一个类,该类继承Application类
2.在配置文件清单中配置该Application类
3.实现oncreate方法,捕获异常信息

关键代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import android.app.Application;
import android.os.Environment;
/**
 * 注意:一定要记得在清单文件中配置
 * @author Administrator
 *
 */
public class BaseApplication extends Application {
    //Called when the application is starting当应用程序被开启的时候调用
    //before any other application objects have been created
    @Override
    public void onCreate() {
        //老母子的方法。 基地
        //重新系统的异常处理器
        Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHander());
        super.onCreate();
    }
    //要全局捕获异常,需要自定义一个类,该类须要继承UncaughtExceptionHandler
    private class MyExceptionHander implements UncaughtExceptionHandler{
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            //留下了 留下遗嘱的时间
            System.out.println("发生了异常,但是被我们给捕获了。。");

            //专注自杀的方法,就是杀死自己的进程, 早死早超生
                             android.os.Process.killProcess(android.os.Process.myPid());
        }
    }
}

通过以上代码,我们已经可以全局捕获到异常信息了,也就是不管你的app在哪里出现了异常,基本上都可以捕获得到。捕获到的异常,通过参数ex传入到方法uncaughtException()中,下一步,我们在方法uncaughtException()将异常信息写到SD卡里
关键代码如下:

try {
                StringWriter wr = new StringWriter();
                PrintWriter pw = new PrintWriter(wr);
                ex.printStackTrace(pw);
                File file = new File(Environment.getExternalStorageDirectory(),"error.log");
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(wr.toString().getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }

整体代码如下:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import android.app.Application;
import android.os.Environment;
/**
 * 注意:一定要记得在清单文件中配置
 * @author Administrator
 *
 */
public class MobileSafeApplication extends Application {
    //Called when the application is starting当应用程序被开启的时候调用
    //before any other application objects have been created
    @Override
    public void onCreate() {
        //老母子的方法。 基地
        //重新系统的异常处理器
        Thread.currentThread().setUncaughtExceptionHandler(new MyExceptionHander());
        super.onCreate();
    }

    private class MyExceptionHander implements UncaughtExceptionHandler{
        @Override
        public void uncaughtException(Thread thread, Throwable ex) {
            //留下了 留下遗嘱的时间
            System.out.println("发生了异常,但是被我们给捕获了。。");
            try {
                StringWriter wr = new StringWriter();
                PrintWriter pw = new PrintWriter(wr);
                ex.printStackTrace(pw);
                File file = new File(Environment.getExternalStorageDirectory(),"error.log");
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(wr.toString().getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            //专注自杀的方法,就是杀死自己的进程, 早死早超生
            android.os.Process.killProcess(android.os.Process.myPid());
        }
    }
}

好了,我们已经把异常信息写到SD卡里面了,但只要出现异常崩溃,程序就挂了,虽然可以通过SD卡里面保存的异常日志查看异常信息,可是出现问题的手机可能是客户的,所以为了能让我们开发人员更好的维护,就要在application调用oncreate方法时,将异常信息发送到服务器。有一个免费的比较好的异常管理工具,叫做bugly,它是腾讯bugly提供的,网址> http://bugly.qq.com,不收钱,只要大家使用QQ登录进去就可以了,并且界面管理得挺好,它其实已经帮我们把以上关于全局异常捕获的类封装好了,还提供了一个异常回调的函数。我们只需要将其jar包导入到自己的工程,在application中调用,就可以了。
关键代码如下:

CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(context); //App的策略Bean
        strategy.setAppVersion(CommonUtil.getVersionName(context));      //App的版本
        strategy.setAppReportDelay(5000);  //设置SDK处理延时,毫秒
        //回调类CrashHandleCallback的方法里面已经封装了全局捕获异常,并且当出现异常时,自动上传到腾讯bugly,无需手动上传
        strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
            /**
             *
             * @param crashType 错误类型   CRASHTYPE_JAVA=0,CRASHTYPE_NATIVE=2;CRASHTYPE_U3D=3;CRASHTYPE_ANR=4
             * @param errorType 错误类型名
             * @param errorMessage 错误信息
             * @param errorStack 错误堆栈
             * @param //Map<String key, String value>  额外的自定义上传信息
             * @return
             */
            @Override
            public synchronized Map<String, String> onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) {
                FileOutputStream fos=null;
                try {
                    File file = new File(Environment.getExternalStorageDirectory(),"/error.log");
//              File file = new File("E://error.log");
                    fos = new FileOutputStream(file);
                    String time= CommonUtil.getDateFormat(System.currentTimeMillis());
                    String error="crashType----->"+crashType+"--errorType--"+errorType+"--errorMessage-->"+errorMessage+"--errorStack-->"+errorStack+"_发生异常时间:"+time;
                    LogUtils.d(this.getClass().getSimpleName(),error);
                    fos.write(error.getBytes());
                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    if(fos!=null){
                        try {
                            fos.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        fos=null;
                    }
                }
                //专注自杀的方法,就是杀死自己的进程, 早死早超生,但杀死进程后,将无法上传异常到腾讯bugly
                Process.killProcess(Process.myPid());
                return null;
            }
        });
        CrashReport.initCrashReport(context, "900004802", true, strategy); //自定义策略生效,必须在初始化SDK前调用
        CrashReport.setUserId("aixiu_org");
也就是说,我们在处理异常的时候,前面的步骤也都可以忽略掉了,直接参考腾讯bugly提供文档,然后把它集成到自己的项目中,就OK了。这样,当出现异常信息的时候,不仅可以写到SD卡,再次进入app时,还可以将异常信息上报到bugly服务器,只要登录到

http://bugly.qq.com就可以管理了

如果这文章对你有用,请点赞,谢谢!!!

Android 全局崩溃日志(CrashHandle)记录

一、全局日志的初始化 在自定义Application中添加此方法,并在自定义Application的onCreate中调用 private void initCrashhandle() { ...
  • yingtian648
  • yingtian648
  • 2017年06月19日 09:31
  • 266

Android CrashHandler 自定义崩溃异常捕获

当APP 异常奔溃时,使用Toast提示,并关闭APP,收集错误信息保存并上报 需求:由于android机型的碎片化,我们在开发时无法对所以机型进行测试,因此在可能的崩溃发生时,我们应当做一些事情来...
  • superchao_5
  • superchao_5
  • 2016年07月04日 21:35
  • 2782

将android客户端的错误日志压缩上传到服务器

将android客户端的错误日志压缩上传到服务器 源代码下载地址:http://www.zuidaima.com/share/1550463760370688.htm...
  • springmvc_springdata
  • springmvc_springdata
  • 2015年05月24日 10:08
  • 1010

Android进阶——Crash异常捕获并发送到服务器

前言 在项目中,我们常常会遇到Crash的现象,也就是程序崩溃的时候,这个时候最常看到的就是这个界面 如果你的项目已经发布到市场上了,这样的崩溃对于开发人员是看不到的,所以我们得想方法将崩溃信...
  • qq_30379689
  • qq_30379689
  • 2016年12月19日 01:18
  • 4672

android自定义异常处理与错误日志上传

使用场景: 1.作为一个android开发者,我们在使用真机调试的时候如果不建立adb连接是很难查看程序报出的错误信息的,我们通过使用此方法可以将错误日志捕获并且存储到本地或者上传到服务器。 2.当我...
  • razeSpirit
  • razeSpirit
  • 2016年11月05日 17:44
  • 9302

android收集bug(异常)信息,上传至服务器

转载请标明出处 [我的博客]http://www.lostbug.cn /** * UncaughtException处理类, * 当程序发生Uncaught异常的时候,有该类来接管程序,...
  • rockan007
  • rockan007
  • 2016年06月07日 10:49
  • 2316

Android导入三方SDK时遇到的一些异常及解决方案

异常解决方案 :Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build....
  • zgd826237710
  • zgd826237710
  • 2016年07月04日 11:19
  • 10067

Android捕获异常保存SD卡或上传服务器

package com.mktech.john.exception.crash; import android.content.Context; import android.os.Environm...
  • johnWcheung
  • johnWcheung
  • 2016年11月15日 23:51
  • 786

Android Crash监测工具Bugly初体验

腾讯开放平台全新上线的Crash监控平台Bugly,今天体验了,并分享我的经验     1.首先打开网站http://bugly.qq.com使用qq号注册bugly账号     2.下载SDK,将b...
  • doubleliutie
  • doubleliutie
  • 2015年11月22日 19:52
  • 86

Android App崩溃上传日志到服务器并且重启!

我们写程序的时候都希望能写出一个没有任何Bug的程序,期望在任何情况下都不会发生程序崩溃。但没有一个程序员能保证自己写的程序绝对不会出现异常崩溃。特别是当你用户数达到一定数量级后,你也更容易发现应用不...
  • u010698836
  • u010698836
  • 2016年02月18日 15:30
  • 1577
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android关于全局异常捕获及发送到服务器
举报原因:
原因补充:

(最多只允许输入30个字)