关闭

Android全局异常捕获

标签: android异常
574人阅读 评论(0) 收藏 举报
分类:

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

0
0
查看评论

Android全局异常捕获机制

安卓异常整体解决方案,从异常捕获、到异常日志写入、到异常上报等。。
  • XiNanHeiShao
  • XiNanHeiShao
  • 2017-06-15 21:26
  • 2245

Android 全局异常捕获

今天就来说说作为程序猿的我们每天都会遇到的东西bug,出bug不可怕可怕的是没有出bug时的堆栈信息,那么对于bug的信息收集就显得尤为重要了,一般用第三方bugly或者友盟等等都能轻易收集,但是由于公司不让使用第三方,而安卓正好有原生的异常收集类UncaughtExceptionHandler,那...
  • zly921112
  • zly921112
  • 2016-07-09 18:01
  • 7296

Android自定义捕获Application全局异常

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的bug修复帮助极大,所以今天...
  • jdsjlzx
  • jdsjlzx
  • 2012-05-27 13:16
  • 47131

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

这篇文章主要为大家介绍了Android全局异常的捕获处理,为什么要进行捕获处理,如何进行捕获处理,想要了解的朋友可以参考一下 在Android开发中在所难免的会出现程序crash,俗称崩溃。用户的随意性访问出现测试时未知的Bug导致我们的程序crash,此时我们是无法直接获取的错误...
  • cc20032706
  • cc20032706
  • 2017-04-07 16:00
  • 431

Android开发之全局异常捕获

Android开发之全局异常捕获今晨谷歌正式发布Android 8.0,新版本的Android O系统对API做出了各种变更,其中大部分会影响到很多应用,其中包括记录未捕获的异常. 如果某个应用安装的Thread.UncaughtExceptionHandler未移交给默认的Thread.Unca...
  • klxh2009
  • klxh2009
  • 2017-08-22 14:53
  • 1585

Android全局异常捕获,不退出应用,让应用正常运行下去!

Android全局异常捕获,不退出应用,让应用正常运行下去! 当App发现异常后,如果程序没有处理,将交给虚拟机进行处理,通常会弹出一个对话框,然后退出应用。但大多数的应用可能对后续流程影 响不大,比如分享功能出现。 一个问题,真的有必要关闭整个应用吗?屏蔽这个功能,对整体来说不会有太大的影响...
  • zhangzheng0602
  • zhangzheng0602
  • 2017-04-06 11:05
  • 1231

Android异常处理——UncaughtExceptionHandler捕获全局异常

Android系统的“程序异常退出”,给应用的用户体验造成不良影响。为了捕获应用运行时异常并给出友好提示,便可继承UncaughtExceptionHandler类来处理。通过Thread.setDefaultUncaughtExceptionHandler()方法将异常处理类设置到线程上即可。 &...
  • haovip123
  • haovip123
  • 2015-08-16 20:15
  • 3147

Android中处理崩溃异常

大家都知道,现在安装Android系统的手机版本和设备千差万别,在模拟器上运行良好的程序安装到某款手机上说不定就出现崩溃的现象,开发者个人不可能购买所有设备逐个调试,所以在程序发布出去之后,如果出现了崩溃现象,开发者应该及时获取在该设备上导致崩溃的信息,这对于下一个版本的bug修复帮助极大,所以今天...
  • liuhe688
  • liuhe688
  • 2011-07-04 19:28
  • 107326

Android开发中的异常统一处理

Android开发中的异常统一处理 实际开发中为了防止程序异常奔溃,而使得开发人员不知道奔溃原因,且影响用户体验:所以我们应该在app中统一处理异常,拦截异常信息,上报服务器。 一自定义异常拦截实现Thread.UncaughtExceptionHandler重写拦截异常方法 public clas...
  • xuwb123xuwb
  • xuwb123xuwb
  • 2017-06-16 16:40
  • 224

android异常全局监听工具

/**  * @author 异常处理类,当程序发生Uncaught异常的时候,有该类来接管程序,并记录发送错误报告  *   */ public class CrashHandler implements UncaughtExceptionHandler {...
  • shizhen_2012
  • shizhen_2012
  • 2016-08-15 15:37
  • 635
    个人资料
    • 访问:43020次
    • 积分:894
    • 等级:
    • 排名:千里之外
    • 原创:47篇
    • 转载:1篇
    • 译文:0篇
    • 评论:5条
    打赏博客请点击
      感谢您打赏 微信扫一扫
      微信
    最新评论