一:问题描述
    闪退(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等,大家如果感兴趣可以自行了解。

阿里安卓面试分析: Android应用的闪退(crash)问题跟踪和解析的更多相关文章

  1. 阿里客户端工程师试题简析——Android应用的闪退(crash)分析

    1. 问题描述 闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法.在出现crash后如何捕捉并分析异常这两个问题给出自己的解 ...

  2. android sdk manager 闪退 打不开问题

    android sdk manager 闪退 打不开问题 环境 win8系统 如果访问不了  dl-ssl.google.com 网址,在C:\Windows\System32\Drivers\etc ...

  3. 解决Xamarin Android SDK Manager闪退问题

    解决Xamarin Android SDK Manager闪退问题 SDK Manager闪退是因为它找不到java.exe导致的.SDK Manager默认是通过读取注册表中JDK安装信息来java ...

  4. Mac Eclipse上Android SDK manager闪退的问题!!

    最近想自学一下Android,也没啥人指导,安装的过程中就花了一整天....安装完ADT,安装完SDK,所有步骤都照着网上来,可是一打开SDK manager就闪退!网上所有方法都找了,可是几乎全是w ...

  5. iOS闪退日志的收集和解析

    在开发过程中往往会遇见有个别用户或者测试人员反馈app的闪退现象,而项目一般集成的统计闪退的第三方库是笼统的统计了所有的闪退信息,无法去定位某一个用户提出的某一个时间点的某一个闪退问题,于是乎这个时候 ...

  6. iOS 10 因苹果健康导致闪退 crash

    如果在app中调用了苹果健康,iOS10中会出现闪退.控制台报出的原因是: Terminating app due to uncaught exception 'NSInvalidArgumentEx ...

  7. Android SDK Manager 闪退的解决办法

    (一)方案一 原理:  SDK Manager.exe 通过调用 android-sdk-windows\tools\lib\find_java.bat 确认  java.exe 的路径 启用 cmd ...

  8. Android SDK manager 闪退

    在SDK安装目录找到tools文件夹,点击进入找到android.bat右键编辑:找到如下指令: rem Check we have a valid Java.exe in the path. set ...

  9. Instant Run 的操作影响到了代码,导致Android App启动闪退的问题

    转自yuhc163原文android启动应用java.lang.NoClassDefFoundError: Class not found using the boot class loader; n ...

随机推荐

  1. esri-leaflet入门教程(2)-地图的HelloWorld

    esri-leaflet入门教程(2)-地图的HelloWorld by 李远祥 常言道"君子性非异也,善假于物也".这句话在IT界同样也适用,只不过IT界有更为时髦的说法:&qu ...

  2. Use Prerender to improve AngularJS SEO

    Use Prerender to improve AngularJS SEO Nuget Package of ASP.NET MVC HttpModule for prerender.io: Ins ...

  3. 【微信开发】玩转PHP 数组用法!

    数组的起始下标可以不从0开始,例子为从2开始. $data = array(2=>'A','B','C');     运行结果:$data = array(2=>'A',3=>'B' ...

  4. matlab 中max函数用法

    Matlab中max函数在矩阵中求函数大小的实例如下:(1)C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的 ...

  5. java中静态代码块,构造代码块,以及构造方法的执行顺序

    写了许久的代码,却把一些基础的东西都给忘了,今天无聊就顺手写了个,然后测试下,发现跟我记忆中的竟然有些出入,作为一个两年的开发,我感觉自己很失败啊. 父类pojo: public class Pojo ...

  6. CentOS安装Git服务器

    1.安装Git $ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel $ yum ...

  7. VS2008编译汇编程序的问题

    在VS2008 pro里已经集成了MASM,经过相关设置后,编译出了程序,但是执行后,说少msvcr90.dll39944然后自己写了个39945 那个testprintf是执行正常的.虽然两个都有引 ...

  8. Scala入门 【1】

    Scala入门 [1] 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 基础 val定义的为常量,var为变量 val name:Type = ***,变量名后加冒号 ...

  9. [Noi2014]魔法森林( 动态mst lct)

    以前一直觉得lct特别难写,自从学了丽洁姐的lct之后,觉得lct居然能这么短,这个主程序能40行左右解决~~~~ 这道嘛~~虽说能用spfa解决,但还是写下lct吧 把边按a值排序后一条一条插入并维 ...

  10. Animate自定义动画

    在jQuery中出了基本的动画之外,还有用户 可以自定义的函数,Animate() 用于创建自定义动画的函数. apI上指出: 这个函数的关键在于指定动画形式及结果样式属性对象.这个对象中每个属性都表 ...