Android全局异常捕获

原创 2016年08月29日 23:40:04

在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。这就会极大的影响用户体验,此时我们需要注册一个功能来捕获全局的异常信息,当程序出现crash信息,我们把错误log记录下来,上传到服务器,以便于我们能及时修复bug。这时我们就需要自己来进行处理,现在这里介绍用第三方库 Sentry-Android 来进行捕获,下面就开始在AS中进行实际操作。

在用这个之前先进行下面以下配置:

配置权限:

 <!-- REQUIRED to send captures to Sentry -->
<uses-permission android:name="android.permission.INTERNET" />

<!-- OPTIONAL but makes Sentry-Android smarter -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

Gradle导入包

 compile 'com.joshdholtz.sentry:sentry-android:1.4.4'

在启动Activity中初始化Sentry,开始监听

 String yourDSN = "填写你自己的DSN";
        Sentry.init(this, yourDSN);
        Sentry.debug = true;
        Sentry.captureMessage("捕获异常数据的Log");

PS:直接使用Sentry的话,它只会把你手机的device、device.family、 level、 os、 os.name显示出来.

如需显示App手机其他信息的话就需要自定义SentryManager,下面我们就来自定义代码。

/**
 * Sentry 管理器,负责初始化 Sentry Client,并在捕捉事件时增加 OS, Device, Build 等设备和软件信息
 */
public class SentryManager {
    private final static String osVersion = Build.VERSION.RELEASE;
    private final static String deviceName = getDeviceName();
    private static int buildVersion = 0;

    /**
     * 初始化 Sentry
     * @param context 上下文
     */
    public static void init(final Context context, String dsn) {
        Sentry.setCaptureListener(new Sentry.SentryEventCaptureListener() {
            @Override
            public Sentry.SentryEventBuilder beforeCapture(Sentry.SentryEventBuilder builder) {
            //在这里面你想要什么信息的话直接builder.getTags().put("key", "值")就可以了
                try {
                    if (buildVersion == 0) {
                        buildVersion = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionCode;
                    }
                } catch (PackageManager.NameNotFoundException e) {
                    buildVersion = -1;
                }

                try {
                    builder.getTags().put("OS", osVersion);
                    builder.getTags().put("Device", deviceName);
                    builder.getTags().put("Build", buildVersion);
                } catch (JSONException e) {
                    // we do nothing
                }
                return builder;
            }
        });

        Sentry.init(context.getApplicationContext(), dsn);
    }

    /**
     * 获得设备名称
     *
     * @return 设备名称
     */
    private static String getDeviceName() {
        String manufacturer = Build.MANUFACTURER;
        String model = Build.MODEL;
        if (model.startsWith(manufacturer)) {
            return capitalize(model);
        } else {
            return capitalize(manufacturer) + " " + model;
        }
    }

    /**
     * 大写首字母
     *
     * @param s 字符串
     * @return 将首字母大写返回的字符串
     */
    private static String capitalize(String s) {
        if (s == null || s.length() == 0) {
            return "";
        }
        char first = s.charAt(0);
        if (Character.isUpperCase(first)) {
            return s;
        } else {
            return Character.toUpperCase(first) + s.substring(1);
        }
    }
}

在Activity调用,跟上面一样

String yourDSN = "填写你自己的DSN";
        SentryManager.init(this, yourDSN);
        Sentry.debug = true;
        Sentry.captureMessage("捕获异常数据的Log");

这里用到的第三方库地址 Sentry-Android

最后 这里还可以使用官方推出的Raven来进行捕捉,不过主干上还没有从本地上传到服务器上,不过起分支已有,可以去关注下 Raven官方出的捕获异常框架

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

详解Android全局异常的捕获处理

这篇文章主要为大家介绍了Android全局异常的捕获处理,为什么要进行捕获处理,如何进行捕获处理,想要了解的朋友可以参考一下 在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随...

Android捕获全局异常

Android捕获全局异常 程序避免不了出现bug,导致程序崩溃,为了尽量不影响用户体验,可以全局捕获异常 效果图 异常捕获处理前异常捕获处理后 捕获异常的工具类package com.examp...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

Android全局异常捕获

一、构建异常处理的消息Handler /** * 用于捕获系统未知异常,并将异常写入log文件,便于开发人员查看 * * @author wangmf */ public class C...

Android全局异常捕获

在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误log的,也就无法修复Bug。这就会极大的影...

android 捕获全局异常

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了...

android捕获全局异常

引出android程序在运行的时候,当Thread 因未捕获的异常而突然终止时,我们无法获取异常信息,因此需要调用处理程序的接口。大家都知道,现在安装 Android 系统的手机和设备千差万别,在模拟...

Android全局异常捕获

Android应用不可避免的会发生各种各样的crash,也称之为闪退。无论你的程序写的多么完美,crash是不可避免的,可能是由于Android系统底层的bug,也可能是由于不充分的机型适配或者糟糕的...

Android 全局异常捕获

今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于...

Android 全局异常捕获

全局异常捕获废话不多说,直接上代码package com.util;import java.io.PrintWriter; import java.io.StringWriter; import ja...

Android 全局异常捕获

今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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