Android全局异常捕获

来源:互联网 发布:东方财富炒股软件 编辑:程序博客网 时间:2024/05/01 01:31

在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
原创粉丝点击