安卓稳定性之crash详解

目录

  • 前言
  • 一、Crash 的基本原理
  • 二、Crash 分析思路
  • 三、实例分析
  • 四、预防措施
  • 五、参考链接


前言

在开发和测试 Android 应用程序时,遇到应用程序崩溃是很常见的情况。 Android 崩溃指的是应用程序因为异常或错误而无法正常执行,并且导致应用强制关闭。


一、Crash 的基本原理

Android 应用运行在 Dalvik/ART 虚拟机中,当应用中出现未处理的异常时,虚拟机会终止应用的进程,导致应用崩溃。通常, Android Crash 可以分为以下几种类型:

  1. 空指针异常(NullPointerException) :当代码尝试访问一个空对象引用时,会抛
    出该异常。
  2. 数组越界异常(ArrayIndexOutOfBoundsException) :当代码尝试访问超过数组
    边界范围的元素时,会抛出该异常。
  3. 类转换异常(ClassCastException) :当代码尝试将一个对象转换成不兼容的类型
    时,会抛出该异常。
  4. 内存泄漏(Memory Leaks) :当应用程序持有对某个对象的引用,但该对象已经
    不再需要并且无法被释放回收时,就发生了内存泄漏。
  5. 资源未释放(Resource Not Released) :在使用一些需要手动管理资源(如数据
    库连接、文件流等)的情况下,如果没有正确释放这些资源,在长时间运行后可能
    导致系统资源耗尽并触发崩溃

二、Crash 分析思路

  1. 收集 Crash 信息
    要分析 Crash,首先需要收集相关的信息。我们可以通过以下途径获取 Crash 信息:
    • Android Studio 的 Logcat
    • 第三方 Crash 收集工具(如: Firebase Crashlytics, Bugly 等)
    • 操作系统提供的日志工具(如: adb logcat)

  2. 分析 Crash 日志
    分析 Crash 日志是定位问题的关键。我们需要关注以下几个方面的信息:
    • 异常类型: Java 层异常、 Native 层异常或 ANR
    • 异常原因:例如空指针异常、数组越界等
    • 堆栈信息:从堆栈信息中,我们可以定位到具体的代码行数

  3. 重现崩溃
    为了更好地理解问题,我们需要尝试重现崩溃。这可以帮助我们确定崩溃发生的条件和场
    景。重现崩溃还可以帮助我们验证解决方案是否有效。

  4. 调试和测试
    在确定崩溃原因后,我们需要进行调试和测试。这可以帮助我们验证解决方案是否有效,
    并确保它不会引入新的问题。一般 crash 的问题比较明显,容易找到问题。


三、实例分析

案例:空指针异常

09-22 07:16:41.848 +0000 17248 17248 D AndroidRuntime: Shutting down VM
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: *** FATAL EXCEPTION INSYSTEM PROCESS: main
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: java.lang.NullPointerException: Attempt to read from field 'java.lang.String com.android.server.pm.Settings$VersionInfo.fingerprint' on a null object reference
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.server.pm.PackageManagerService.<init>(PackageManagerService.java:7613)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.server.pm.PackageManagerService.main(PackageManagerService.java:7121)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.server.SystemServer.startBootstrapServices(SystemServer.java:1166)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.server.SystemServer.run(SystemServer.java:880)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.server.SystemServer.main(SystemServer.java:613)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
09-22 07:16:41.848 +0000 17248 17248 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
09-22 07:16:41.850 +0000 17248 17248 E AndroidRuntime: Error reporting crash
09-22 07:16:41.850 +0000 17248 17248 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke interface method 'void android.app.IActivityManager.handleApplicationCrash(android.os.IBinder,android.app.ApplicationErrorReport$ParcelableCrashInfo)' on a null object reference
09-22 07:16:41.850 +0000 17248 17248 E AndroidRuntime: at com.android.internal.os.RuntimeInit$KillApplicationHandler.uncaughtException(RuntimeInit.java:156)
09-22 07:16:41.850 +0000 17248 17248 E AndroidRuntime: at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1073)
09-22 07:16:41.850 +0000 17248 17248 E AndroidRuntime: at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
09-22 07:16:41.850 +0000 17248 17248 E AndroidRuntime: at java.lang.Thread.dispatchUncaughtException(Thread.java:2200)

分析过程:
(1) Settings$VersionInfo.fingerprint 为空,找到出现问题的代码:
在这里插入图片描述
(2)自己对源码进行分析,发现一个方法,该方法能创建或者找到版本的信息,如果为空
则添加到集合中。而报错的地方,是调用 getInternalVersion(),没有做判空的处理。
在这里插入图片描述
(3)继续跟踪代码, mVersion 是一个集合,通过键值对来获取那个值
在这里插入图片描述
(4)UUID_PRIVATE_INTERNAL 是 null
在这里插入图片描述
(5)猜想空指针异常可能是没有调用 findOrCreateVersion(),没有创建对应的值并且没有
put 到集合中。并且打印了正常能开机的 mVersion 的大小,都是 2。
在这里插入图片描述
修改方案如下:
在这里插入图片描述


四、预防措施

为了减少应用程序崩溃的风险,可以采取以下预防措施:

  1. 良好的异常处理:在关键代码块中使用 try-catch 语句来捕获和处理可能抛出的异常。这样可以避免应用程序因为未处理的异常而崩溃,并提供更友好的用户体验。
  2. 合理地使用空值检查:确保在访问对象之前进行适当的空值检查,以避免触发空指针异常。
  3. 正确释放资源:对于需要手动管理资源(如数据库连接、文件流等),始终确保及时释放这些资源,以避免资源泄漏和系统负载过高导致崩溃。
  4. 谨慎使用第三方库:选择可靠且经过广泛测试的第三方库,并仔细阅读其文档和源代码。不推荐使用已知存在问题或长期无更新支持的库。
  5. 定期进行性能优化和内存管理:通过减少内存占用、优化算法、限制并发线程数等方法,改善应用程序性能并减少崩溃风险。
  6. 多渠道测试与发布前验证:在发布前进行全面测试,并覆盖各种设备、操作系统版本和网络条件下运行应用程序的场景。这有助于发现并修复潜在的崩溃问题。

五、参考链接

Android中Crash原理及监控处理
Android app 崩溃 & Crash 分析
Android Crash 问题分析以及解决


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/770815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

通过一个单相逆变器仿真深度学习PR控制器

目录 前言 ​编辑 PR控制器的理论 PR控制器不同表达式及其建模 PR控制器连续积分组合及模型 PR控制器连续传递函数及模型 PR控制器离散积分及模型 PR控制器离散传递函数及模型 PR控制器差分方程及模型 系统仿真效果 总结 前言 在项目开发中常用PI控制器&#xff0c;这次在…

java实现【 生成小程序二维码:图片+二维码备注】

1.逻辑&#xff1a;进行获取小程序的token进行-获取不限制的小程序码。2.参考的地址&#xff1a;微信官方文档&#xff1a;官网-获取不限制的小程序码 需要注意的点&#xff1a;1. 如果传入page这个参数的话必须定义check_path参数&#xff0c;不然无法识别-page指定的目录2. …

2024微信小程序期末大作业-点奶茶微信小程序(后端nodejs-server)(附下载链接)_微信小程序期末大作业百度网盘下载

菜单展示 购物车展示&#xff1a; 提交订单&#xff1a; 支付详情页展示&#xff1a; 订单查看&#xff1a; 查看历史消费&#xff1a; 部分代码展示&#xff1a; <!--pages/home/home.wxml--> <block wx:for"{{listData}}" wx:key"itemlist&qu…

国标GB28181视频汇聚平台LntonCVS视频监控安防平台与国标协议对接解决方案

应急管理部门以“以信息化推动应急管理能力现代化”为总体目标&#xff0c;加快现代信息技术与应急管理业务深度融合&#xff0c;全面支持现代应急管理体系建设&#xff0c;这不仅是国家加强和改进应急管理工作的关键举措&#xff0c;也是应对日益严峻的应急管理形势和满足公众…

数据列表组件-报表

当数据在后端接口查询到&#xff0c;需要在页面展示出来&#xff0c;如果项目有很多report &#xff0c;可以把列表做一个组件 效果如下&#xff1a; js代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8" /><title&g…

PKUMOD同学又双叒获奖啦~

近期王选所数据管理研究室的同学们 凭借在各自领域的卓越表现 获得了多项荣誉和奖励 让我们共赏风采~ 期待他们在未来的科研道路上 取得更加辉煌的成就 庞悦 前沿交叉学科研究院2020级博士生 荣获2024年北京大学校长奖学金 庞悦&#xff0c;北京大学元培学院2016级本科生&…

zabbix小白入门:从SNMP配置到图形展示——以IBM服务器为例

作者 乐维社区&#xff08;forum.lwops.cn&#xff09;许远 在运维实践中&#xff0c;Zabbix作为一款强大的开源监控工具&#xff0c;被广泛应用于服务器、网络设备和应用程序的监控&#xff0c;成为保障业务连续性和高效运行的关键。然而&#xff0c;对于Zabbix的初学者来说&a…

2024年前端面试题及答案

7、 nginx代理跨域 8、 nodejs中间件代理跨域 9、 WebSocket协议跨域 前端数据加密问题 1 一般如何处理用户敏感信息&#xff1f; 前端一般使用md5、base64加密、sha1加密&#xff0c;想要了解详情请自行百度。 前端http相关问题 1 HTTP常用状态码及其含义&#xff1f; …

vue-element-admin集成方案如何运行以及代码解读

文章目录 1.vue-admin-admin介绍2.运行方法3.代码解读3.1基础外层文件解读&#xff0c;以及eslint关闭&#xff08;如下图&#xff09;3.2内层src文件分析3.2.1 login流程解析 1.vue-admin-admin介绍 1.1 是一个后台前端解决方案(vueelementui)&#xff0c;内置i18国际化解决方…

行业洞察 | 2024应用程序安全领域现状报告

在信息爆炸的时代&#xff0c;我们每天都在使用各种应用&#xff0c;从社交娱乐到工作学习&#xff0c;应用已经成为我们生活中不可或缺的一部分。然而&#xff0c;你是否知道&#xff0c;在这些便捷的背后&#xff0c;隐藏着巨大的安全风险&#xff1f; 近年来&#xff0c;应用…

Build a Large Language Model (From Scratch)附录D(gpt-4o翻译版)

来源&#xff1a;https://github.com/rasbt/LLMs-from-scratch?tabreadme-ov-file https://www.manning.com/books/build-a-large-language-model-from-scratch

Windows系统安装SSH服务结合内网穿透配置公网地址远程ssh连接

前言 在当今的数字化转型时代&#xff0c;远程连接和管理计算机已成为日常工作中不可或缺的一部分。对于 Windows 用户而言&#xff0c;SSH&#xff08;Secure Shell&#xff09;协议提供了一种安全、高效的远程访问和命令执行方式。SSH 不仅提供了加密的通信通道&#xff0c;…

单片机IO

一、简单GPIO口 保护二极管&#xff1a;IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入。 当引脚电压高于VDD时&#xff0c;上方的二极管导通&#xff0c;电压被钳位在VDD0.7V&#xff1b; 当引脚电压低于VSS时&#xff0c;下方的二极管导通&#xff0c;防止不…

设计模型 - 学习笔记

学习参考&#xff1a; https://blog.csdn.net/m0_65346405/article/details/136994128 《系统分析师教程》 《设计模式之禅》 一. 设计模式的5大原则 1. 单一职责原则 一个类应该只有一个变化因子。 就是说&#xff0c;一个类要变化&#xff0c;比如增加功能&#xff0c;那么引…

Elasticsearch 8.x 存储有无压缩?能压缩到多少?

1、认知前提 Elasticsearch 支持压缩&#xff0c;压缩方式默认为&#xff1a;LZ4 压缩算法。 具体参见&#xff1a; The default value compresses stored data with LZ4 compression, but this can be set to best_compression which uses DEFLATE for a higher compression r…

mybatis mapper.xml 比较运算符(大于|小于|等于)的写法: 转义和<![CDATA[]]>

文章目录 引言I 使用xml 原生转义的方式进行转义II 使用 <![CDATA[ 内容 ]]>引言 应用场景:查询时间范围 背景:在 *.xml 中使用常规的 < > = <= >= 会与xml的语法存在冲突 <![CDATA[]]> 比 转义符 来的繁琐 <![CDATA[]]> 表示xml解析器忽略…

Linux内网端口转公网端口映射

由于服务商做安全演练&#xff0c;把原先服务器内网的端口映射到外网端口全都关闭了&#xff0c;每次维护服务器特别麻烦&#xff0c;像数据库查询如果用原生的mysql 去连接&#xff0c;查询返回的结果乱了&#xff0c;非常不方便。 查了服务还是可以正常访问部分外网的&#x…

mongodb在windows环境安装部署

一、mongodb 1.释义 MongoDB 是一种开源的文档型 NoSQL 数据库管理系统&#xff0c;使用 C 编写&#xff0c;旨在实现高性能、高可靠性和易扩展性。MongoDB 采用了面向文档的数据模型&#xff0c;数据以 JSON 风格的 BSON&#xff08;Binary JSON&#xff09;文档存储&#x…

Unity射击游戏开发教程:(29)躲避敌人的子弹射击

在这篇文章中,我将介绍如何创建一个可以使玩家火力无效的敌人。创建的行为如下...... 当玩家向敌人开火时,敌人会向左或向右移动。向左或向右的移动是随机选择的,并在一段时间后停止敌人的移动。如果敌人移出屏幕,它就会绕到另一边。将一个精灵拖到画布上,将其缩小以匹配游…

mdb转gdb实现过程介绍(2)三种方式实现GDB数据库的读、写,并将实现方式与ArcGIS环境共存配置

一、内容提示 通过解析mdb地理数据库&#xff0c;获取了图层之间的组织结构、空间参考、表字段属性等信息。 下一步&#xff0c;就是将数据输出到GDB中。 下面详细介绍python3.9版本&#xff0c;读写GDB数据的方法&#xff1a; &#xff08;1&#xff09;使用ArcPy创建GDB、读写…