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

发布了48 篇原创文章 · 获赞 19 · 访问量 19万+
展开阅读全文

Android 程序异常弹出消息:很抱歉,程序出现异常即将关闭,但是程序正常运行

07-26

I/art ( 314): Explicit concurrent mark sweep GC freed 5(160B) AllocSpace objects, 0(0B) LOS objects, 89% free, 126KB/1150KB, paused 144us total 19.486ms E/fpcdclient( 6015): failed to connect socket -2 E/fingerprints_service( 6015): fpcd_connect() failed D/AndroidRuntime( 6015): Shutting down VM E/AndroidRuntime( 6015): FATAL EXCEPTION: main E/AndroidRuntime( 6015): Process: com.fingerprints.service, PID: 6015 E/AndroidRuntime( 6015): java.lang.RuntimeException: Unable to create application com.fingerprints.service.FingerprintService: java.lang.RuntimeException: openNative() failed E/AndroidRuntime( 6015): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4590) E/AndroidRuntime( 6015): at android.app.ActivityThread.access$1500(ActivityThread.java:151) E/AndroidRuntime( 6015): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1367) E/AndroidRuntime( 6015): at android.os.Handler.dispatchMessage(Handler.java:102) E/AndroidRuntime( 6015): at android.os.Looper.loop(Looper.java:135) E/AndroidRuntime( 6015): at android.app.ActivityThread.main(ActivityThread.java:5288) E/AndroidRuntime( 6015): at java.lang.reflect.Method.invoke(Native Method) E/AndroidRuntime( 6015): at java.lang.reflect.Method.invoke(Method.java:372) E/AndroidRuntime( 6015): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:915) E/AndroidRuntime( 6015): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:710) E/AndroidRuntime( 6015): Caused by: java.lang.RuntimeException: openNative() failed E/AndroidRuntime( 6015): at com.fingerprints.system.FpcD.<init>(FpcD.java:245) E/AndroidRuntime( 6015): at com.fingerprints.system.FpcD.open(FpcD.java:230) E/AndroidRuntime( 6015): at com.fingerprints.service.ServiceImpl.userEvent(ServiceImpl.java:105) E/AndroidRuntime( 6015): at com.fingerprints.service.ServiceImpl.<init>(ServiceImpl.java:135) E/AndroidRuntime( 6015): at com.fingerprints.service.FingerprintService.onCreate(FingerprintService.java:32) E/AndroidRuntime( 6015): at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012) E/AndroidRuntime( 6015): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4587) E/AndroidRuntime( 6015): ... 9 more W/ActivityManager( 2215): Process com.fingerprints.service has crashed too many times: killing! W/Adreno-ES20( 278): <process_gl_state_enables:519>: GL_INVALID_ENUM W/GLConsumer( 278): [com.android.systemui.ImageWallpaper] bindTextureImage: clearing GL error: 0x500 I/Process ( 6015): Sending signal. PID: 6015 SIG: 9 W/Adreno-ES20( 278): <process_gl_state_enables:519>: GL_INVALID_ENUM W/GLConsumer( 278): [com.android.systemui.ImageWallpaper] bindTextureImage: clearing GL error: 0x500 W/Adreno-ES20( 278): <process_gl_state_enables:519>: GL_INVALID_ENUM W/GLConsumer( 278): [com.android.systemui.ImageWallpaper] bindTextureImage: clearing GL error: 0x500 I/ActivityManager( 2215): Process com.fingerprints.service (pid 6015) has died W/Adreno-ES20( 278): <process_gl_state_enables:519>: GL_INVALID_ENUM W/GLConsumer( 278): [com.android.systemui.ImageWallpaper] bindTextureImage: clearing GL error: 0x500 W/Adreno-ES20( 278): <process_gl_state_enables:519>: GL_INVALID_ENUM W/GLConsumer( 278): [com.android.systemui.ImageWallpaper] bindTextureImage: clearing GL error: 0x500 问答

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

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览