背景
Android开发过程中,APP崩溃是一类非常常见的问题,而且APP崩溃问题很多时候对APP安全还是致命性的。APP崩溃大部分是以闪退的形式出现。APP常见的崩溃原因有:NullPointerException 空指针、ClassCastException 类型转换异常、IndexOutOfBoundsException 下标越界异常、ActivityNotFoundException Activity未找到异常、IllegalStateException 非法状态异常、ArrayIndexOutOfBoundsException 数组越界异常、SecurityException 安全异常。下面就详细探索分析App常见崩溃的问题和对应的解决方案。
NullPointerException 空指针
NullPointerException在android开发中经常会碰到这类异常问题,例如引用的对象为空,数组为空等都会引发控制在异常。
数组NullPointerException。
不能向一个空数组元素赋值,获取长度,否则报
NullPointerException: Attempt to write to null array和
NullPointerException Attempt to get length of null array。
以下的数组出现NullPointerException 范例代码,它会触发上面两种空指针异常。
触发NullPointerException 异常的日志信息
空数组元素的赋值异常
Object 对象 NullPointerException
对象空指针,是因为引用一个空对象,进而导致空指针,通常会报以下错误
Attempt to invoke a virtual method on a null object reference,以下代码可能会引起空指针异常。
object对象触发NullPointerException异常的代码
触发NullPointerException 异常日志分析
NullPointerException 解决方案
在代码开发过程中,在使用对象前先进行判断对象是否为空,当对象为空的时候不可使用,只有对象不为空的时候再进行使用。并且通过使用try-catch异常捕获方式将抛出的异常进行捕获处理。
最根本的方法是通过优化代码逻辑,从根本上解决问题
ClassCastException 类型转换异常
这种类型转换异常通常是发生在类型转换时,并且在编译代码期间,编译器不会有报错的提示,但是当运行时,如果存在此异常,可能会导致APP崩溃闪退的情况。
当父类强制转换为子类时,ClassCastException 就会发生类型转换异常
下面的代码,它会引起 ClassCastException异常的出现
异常日志分析
解决方案
通过使用try-catch 进行捕获异常,最主要的还是要从代码上解决根本问题。
IndexOutOfBoundsException 下标越界异常
List 在开发中经常会被用的,那么错误的使用下标,将会导致IndexOutOfBoundsException越界异常。
下面的代码会触发IndexOutOfBoundsException异常
异常日志分析
解决方案
在使用时先进行对对象作判断,判断对象内容是否为0,如果为0的时候那么就不进行使用。
ActivityNotFoundException异常
ActivityNotFoundException的异常,通常出现于Eclipse 开发Android应用中中,Android studio编译器 已经默认自动生成Activity,以及布局文件。
主要原因是未在AndroidMainfest.xml文件中注册,在使用组件 的时候如果未注册,那么就会引起APP crash的情况。
ActivityNotFoundException 代码举例
Activity未在Androidmainfest.xml 中注册会引起ActivityNotFoundException
异常日志分析
ActivityNotFoundException 解决方案
在android中四大组件只有先注册才能正常使用,AndroidManifest.xml中进行注册。
IllegalStateException异常
IllegalStateException它是非法状态异常,是因为在APP应用中代码状态非法导致的。
以下代码会引起IllegalStateException的异常情况,当Button控件声明android:onClick="IllegalStateException" 却未在Java代码中使用时,点击Button,就会出现此类异常。
IllegalStateException 异常范例
异常日志分析如下
解决方案
ArrayIndexOutOfBoundsException 数组越界异常
数组在代码中经常被用到,当适用数组下标不当时,就会出现ArrayIndexOutOfBoundsException。比如数组长度为4,但你要引用下标为5的元素,这时候,就会异常crash。
ArrayIndexOutOfBoundsException 代码举例:
异常日志分析
ArrayIndexOutOfBoundsException解决方案
1、正确使用数组下标
2、如果不确定数组长度,请先获取长度,然后在判断下标是否大于等于数组长度。
3、try-catch 抓住异常,防止crash,但不能从根本上解决问题。
SecurityException 安全异常
SecurityException 安全异常在Android 中也会经常发生,主要是Android 的安全机制原因造成的,为了管理应用获取手机的一些敏感信息,Android安全机制规定,必须在AndroidMainfest.xml 文件中声明,并且,Android 6.0之后,获取手机敏感信息时候,需要动态申请权限,只有用户授权后才可以获取手机敏感信息。
获取手机的IMEI 号属于手机的敏感信息而触发SecurityException异常
异常日志分析如下
SecurityException 解决方案
Android 6.0之前,在AndroidMainfest.xml中申请权限即可,
Android 6.0 之后,请动态申请权限。
参考借鉴文章
https://www.pianshen.com/article/8495643219/
NDK POSIX多线程编程
JNI与NDK编程知识基础详解
Android NDK开发之JNI基础篇
JNI与NDK编程常用方法史上最全总结和详解
NDK开发中Native方法的静态注册与动态注册
JNI与NDK编程函数注册与C++调用Java详解
Android Native内存泄漏检测
用Asan提前解决NDK疑难crash
Android NDK开发中快速定位Crash问题
Android NDK开发基础之C语言的内存管理
Native(C++)开发中如何使用ASan检测内存错误
Android高级开发中ANR/Native Crash问题的解决方法