博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
阿里安卓面试分析: Android应用的闪退(crash)问题跟踪和解析
阅读量:6549 次
发布时间:2019-06-24

本文共 1783 字,大约阅读时间需要 5 分钟。

一:问题描述

    闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法、在出现crash后如何捕捉并分析异常这两个问题给出自己的解决方案。
    我们以Android平台为例,介绍下如何捕获Android应用的闪退信息,以帮助我们定位和解决导致闪退的问题代码。
二:Android中的闪退
    在讲解Android中的闪退之前,我们先来简单的复习下Java中的异常。
1.Java中的异常
    Java中的异常层次结构如下图所示:

    我们可以看到Throwable类是异常层级中的基类。Error类表示内部错误,这类错误使我们无法控制的;Exception表示异常,RuntimeException及其子类属于未检查异常,这类异常包括ArrayIndexOutOfBoundsException、NullPointerException等,我们应该通过条件判断等方式语句避免未检查异常的发生。IOException及其子类属于已检查异常,编译器会检查我们是否为所有可能抛出的已检查异常提供了异常处理器,若没有则会报错。对于未检查异常,我们无需捕获(当然Java也允许我们捕获,但我们应该做的事避免未检查异常的发生)。
    了解了这些我们大概可以知道,不论Android应用因为什么原因闪退,我们只要能够捕获引起闪退的异常,那么我们就可以进行异常处理。对于已检查异常还好说,数量相对较少而且编译器的强制下能够保证我们为所有代码中可能抛出的已检查异常设置异常处理器。然而对于未检查异常,我们难以预测代码在一些极端情形下(比如劣质的SD卡、糟糕的网速)会触发什么样的异常,因而很难捕获所有可能的未检查异常。好消息是Android为我们提供了获取Android应用的闪退信息的机制,下面我们就来介绍一下。
2.捕获导致闪退的异常
    运行的Android进程中存在一个UncaughtExceptionHandler对象(未捕获异常处理器),我们可以通过Thread类的静态方法setDefaultUncaughtExceptionHandler设置当前进程的UncaughtExceptionHandler对象。当出现一个未捕获异常时,系统会调用出现异常的进程的UncaughtExceptionHandler对象的uncaughtException方法,也就是说在Android应用闪退前我们可以在这个方法中获取引起闪退的异常信息。UncaughtExceptionHandler是一个接口,其中只定义了一个uncaughtException方法。
    基于以上的分析我们知道了:只要将当前进程的未捕获异常处理器设置为我们自定义的UncaughtExceptionHandler实例,我们就可以通过重写UncaughtExceptionHandler方法来在闪退前获取导致闪退的异常的详细信息。下面的代码中我们的自定义未捕获异常处理器实现了UncaughtExceptionHandler接口:

public class CrashHandler implements UncaughtExceptionHandler {        @Override        public void uncaughtException(Thread t, Throwable e) {            try {                //传入这个方法的参数e就是引起应用crash的异常,我们可以在这里获取异常信息,可以把异常信息上传到服务器以便统一分析,也可以保存在文件系统中            } catch (Exception e) {                ...            }        }    }

    设计好了自定义未捕获异常处理器后,我们只需把它设置为当前进程的未捕获异常处理器即可,相关代码如下:

Thread.setDefaultUncaughtExceptionHandler(new CrashHandler());

3.第三方解决方案

    关于Android应用的crash分析与处理,有很多成熟的第三方解决方案,比如Bugly、ACRA等,大家如果感兴趣可以自行了解。

转载地址:http://sguco.baihongyu.com/

你可能感兴趣的文章
iOS 7 Development Tips, Tricks & Hacks
查看>>
i/10和i取最后两位的精妙算法(前方高能)
查看>>
SilverLight4常见问题及解决办法
查看>>
如何在IntelliJ IDEA中使用.ignore插件忽略不必要提交的文件
查看>>
[LeetCode]310. Minimum Height Trees
查看>>
深入分析事务的隔离级别
查看>>
计算字体的高度时候,计算的字体要跟 xib 里面字体的大小 要一致的,不然计算的高度是没有意义的,...
查看>>
这两个的意思是不同的。。。
查看>>
label frame没有变,
查看>>
LeetCode题解(一)
查看>>
进程调度算法
查看>>
shell中read使用
查看>>
Java 发送邮件工具类
查看>>
团队项目-地铁线路数据录入代码
查看>>
字符串国际化教程
查看>>
javascript多种方法实现数组去重
查看>>
week06 08 postman 测试jsonrpc
查看>>
henplus
查看>>
[转]iPhone/Mac Objective-C内存管理教程和原理剖析
查看>>
[转]感知器(Perceptron)原理和应用
查看>>