最美的路百转千回

积累知识,也应该有农民积肥的劲头,捡的范围要宽,不要限制太多……牛粪、羊粪、人粪都一概捡回来,让它们统统变成有用的肥料...

Android全局异常捕获

在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官方出的捕获异常框架

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lx_yoyo/article/details/52357673
文章标签: android 异常
个人分类: Android异常
上一篇ListView与item中控件焦点抢占及错位问题
下一篇PopupWindow
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭