阿里安卓面试分析: Android应用的闪退(crash)问题跟踪和解析
一:问题描述
闪退(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)问题跟踪和解析的更多相关文章
- 阿里客户端工程师试题简析——Android应用的闪退(crash)分析
1. 问题描述 闪退(Crash)是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现,请从crash发生的原因分类与解决方法.在出现crash后如何捕捉并分析异常这两个问题给出自己的解 ...
- android sdk manager 闪退 打不开问题
android sdk manager 闪退 打不开问题 环境 win8系统 如果访问不了 dl-ssl.google.com 网址,在C:\Windows\System32\Drivers\etc ...
- 解决Xamarin Android SDK Manager闪退问题
解决Xamarin Android SDK Manager闪退问题 SDK Manager闪退是因为它找不到java.exe导致的.SDK Manager默认是通过读取注册表中JDK安装信息来java ...
- Mac Eclipse上Android SDK manager闪退的问题!!
最近想自学一下Android,也没啥人指导,安装的过程中就花了一整天....安装完ADT,安装完SDK,所有步骤都照着网上来,可是一打开SDK manager就闪退!网上所有方法都找了,可是几乎全是w ...
- iOS闪退日志的收集和解析
在开发过程中往往会遇见有个别用户或者测试人员反馈app的闪退现象,而项目一般集成的统计闪退的第三方库是笼统的统计了所有的闪退信息,无法去定位某一个用户提出的某一个时间点的某一个闪退问题,于是乎这个时候 ...
- iOS 10 因苹果健康导致闪退 crash
如果在app中调用了苹果健康,iOS10中会出现闪退.控制台报出的原因是: Terminating app due to uncaught exception 'NSInvalidArgumentEx ...
- Android SDK Manager 闪退的解决办法
(一)方案一 原理: SDK Manager.exe 通过调用 android-sdk-windows\tools\lib\find_java.bat 确认 java.exe 的路径 启用 cmd ...
- Android SDK manager 闪退
在SDK安装目录找到tools文件夹,点击进入找到android.bat右键编辑:找到如下指令: rem Check we have a valid Java.exe in the path. set ...
- Instant Run 的操作影响到了代码,导致Android App启动闪退的问题
转自yuhc163原文android启动应用java.lang.NoClassDefFoundError: Class not found using the boot class loader; n ...
随机推荐
- 读书笔记 effective c++ Item3 在任何可能的时候使用 const
Const可以修饰什么? Const 关键字是万能的,在类外部,你可以用它修饰全局的或者命名空间范围内的常量,也可以用它来修饰文件,函数和块作用域的静态常量.在类内部,你可以使用它来声明静态或者非 ...
- 【easyui】之treegrid的分页
easyui官网给的treegrid的分页是相当的复杂,我们来简化一下! 首先treegrid 分页和 datagrid一样需要设置一系列参数! 如下: depTreeGrid=$("#de ...
- 【原创】NuGet 出现“无法初始化 PowerShell 主机,如果将你的 PowerShell 执行策略设置设置为 AllSigned ,请先打开程序包管理控制台以初始化该主机” 错误的解决方法
现象: 网上的设置 AllSigned 等方法都无效..后来考虑可能跟命令行版本兼容性有关系,然后在注册表命令行配置里发现一 ForceV2 设置项,抱着试一试的心态改了下,果然解决了! 解决方法:修 ...
- ASP.NET MVC5 实现分页查询
对于大量数据的查询和展示使用分页是一种不错的选择,这篇文章简要介绍下自己实现分页查询的思路. 分页需要三个变量:数据总量.每页显示的数据条数.当前页码. //数据总量 int dataCount; / ...
- 安装和配置Symfony
为了简化创建新项目的过程,Symfony提供一个安装程序. 安装Symfony Installer 使用Symfony Installer是创建新的Symfony项目的唯一推荐方式,这个install ...
- Javascript 异步实现机制
Javascript 单线程指的是在一个浏览器进程中只存在一个 Javascript 执行线程,所以任务需要顺序排列等待执行,而不能像 Java 等多线程语言一样并发执行.但是这种单线程模型在处理耗时 ...
- 如何用js实现自适应,原来只是几行代码的事(╯‵□′)╯︵┻━┻
在javascript写下如下几行: (function (doc, win, undefined) { var docEl = doc.documentElement, ...
- PB程序“无法启动此程序,因为计算机中丢失PBvm90.dll。尝试重新安装该程序以解决此问题”的解决方法
因为有计算机自考科目,要求使用PB程序做一个管理系统.昨天刚安装好了PB程序,今天使用的时候,当我打开一个PB程序时,出现了"无法启动此程序,因为计算机中丢失PBvm90.dll.尝试重新安 ...
- gridcontrol显示行号,总行,打印,导出Excel,设置标头及内容居中方法
1.一般为了表格显示数据更直观,经常会显示行号以及总数.让gridcontrol显示行号,首先你需要设置一下显示行号的宽度,也就是IndicatorWith.默认值为-1,可根据实际数值需要设置宽度, ...
- php与微信基础的学习
我们要搞的是用php来与微信进行信息交互,现在是一个学习过程...结合慕课网渔夫老师的讲解. 微信公众号的申请具体可百度,太简单不予说明,微信本身功能也挺多,也有相关第三方平台,然而我们学习编程--具 ...