Android Crash详解

目前我们知晓的Android客户端上会出现的三种导致APP无法使用的原因有Java崩溃,Native崩溃以及ANR。以下内容从三种错误展开,建立在自行调研以及实践的基础上。

Java崩溃

Java崩溃就是在Java/kotlin代码中,出现了未捕获异常,导致程序异常退出。通常是由我们自己的业务代码导致,例如空指针,索引越界等常见的崩溃。Java的崩溃日志相对于Native和ANR的堆栈日志,阅读和定位难度为最低。一般在配合mapping文件反混淆之后都可以直接定位错误。

java崩溃捕获 

class JavaCrashHandler implements UncaughtExceptionHandler{
    
    //在初始化的时候
    void initialize(){
    ......
        Thread.setDefaultUncaughtExceptionHandler(this);

    }

     @Override
    public void uncaughtException(Thread thread, Throwable throwable) {

        //处理异常 读取信息 上传或者其他处理
        handleException(thread, throwable);
    }

}

这部分异常捕捉由于有现成的接口提供所以很容易。只需要大家处理好读取部分的逻辑就没什么大问题,上报的时候采集一些附带信息即可。

java崩溃日志解析

解析java日志,首先需要的是mapping.txt文件。Grade 3.4版本之前,使用Proguard工具,之后Android 在新版中启用了 R8 编译器,没有使用 Proguard 工具,虽然兼容 Proguard 的配置和字典等,但是编译出来的 Mapping 文件格式还是有一点不同。如果开启混淆功能,则会产生Mapping 文件,用来逆向推出原始的堆栈信息,更快更方便的定位问题。位置路径:build/output/mapping/release/mapping.txt

或者

build/output/mapping/${flavorDir}/release/mapping.txt

大家可以自行查看mapping文件的内容,可以发现就是一张映射表,利用不同的字母组合代表指定的类或者方法等。如下图展示:

用来解析崩溃日志的工具是sdk中自带的retrace。路径为:sdk/tools/proguard/bin/retrace.sh。解析命令为:

retrace (mapping文件路径) (java crash文件路径)

其中java日志的格式如下,大家获取日志的时候可以自行搜索retrace解析日志格式,随着版本升级应该会有变动。

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***

其他字段信息....
....
java stacktrace:
    ....

其他信息...

+++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++ +++

举例如:

*** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Build fingerprint: 'samsung/dreamqltezc/dreamqltechn:9/PPR1.180610.011/G9500ZCU4DSH2:user/release-keys'
ABI: 'arm64'

java stacktrace:
java.
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用程序在运行时遇到分段错误(Segmentation fault)通常是由于访问无效的内存地址或者内存溢出导致的。这种错误通常是由于编程错误引起的,比如空指针引用、数组越界访问等。解决这个问题的步骤如下: 1. 检查应用程序的日志:在Android Studio的Logcat窗口中查看应用程序的崩溃日志,找到相关的堆栈跟踪信息。这些信息可以帮助定位问题所在。 2. 确认问题发生的条件:尝试重现问题,并确定在什么情况下应用程序崩溃。这可能涉及到特定的用户操作或者特定的数据输入。 3. 检查代码:根据堆栈跟踪信息,找到可能导致问题的代码。检查是否有空指针引用、数组越界访问或者其他潜在的内存访问错误。 4. 使用调试工具:使用Android Studio提供的调试工具,如断点调试、内存监视器等,来帮助定位问题所在。通过在关键代码位置设置断点,可以逐步调试并观察变量值和内存状态,找到导致崩溃的具体原因。 5. 内存管理:检查应用程序的内存使用情况,确保没有内存泄漏或者内存溢出的情况发生。特别注意释放不再使用的资源和避免过度分配内存。 6. 第三方库和依赖项:如果应用程序使用了第三方库或者依赖项,确保它们的版本兼容性和稳定性。有时候问题可能是由于库的Bug导致的,需要更新或者排除这些库。 如果以上步骤无法解决问题,可以尝试使用其他工具进行更深入的分析,比如Memory Analyzer(MAT)等。另外,如果问题仍然存在,可以将相关信息提交给Google的Android开发者社区或者Stack Overflow等技术社区,寻求帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值