记一次使用android studio分析app闪退原因的过程

这篇具有很好参考价值的文章主要介绍了记一次使用android studio分析app闪退原因的过程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

闪退演示

首页和问题反馈重复切换两次就闪退

(因为是公司内部app,原有视频不做展示)文章来源地址https://www.toymoban.com/news/detail-445722.html


app架构

app是原生android studio开发的,部分页面是h5开发的,通过WebView和addJavascriptInterface接口实现js与java的交互


页面修改生效问题

1.由于部分页面是h5开发的,我从代码里直接修改对应的html的代码,比如我在账号的label标签后面加个1,再真机调试,结果发现一点变化都没有,并且从全局搜索里也搜不出登录页面有其他代码,这时候很懵觉得不可能会不生效啊

2.后来同事跟我说修改的html代码要打成zip压缩包放到工程目录里,再打包,app在运行的时候会自动解压,这时候我才知道为什么我无法搜索出登录页面其他相关代码,并且修改了也没生效的原因,于是我照做了,并且成功生效了。有必要记录一下

记一次使用android studio分析app闪退原因的过程


观察日志

可以看到在进入问题反馈的页面的时候,会每隔一秒钟打印一段日志,说明有每秒秒执行一次的线程在不断运行(里面部分中文输出是我加的,因为是先解决完问题再做的记录)

记一次使用android studio分析app闪退原因的过程

紧接着当我切换页面到首页的时候,直接就报空指针异常了,当时我猜测跟这个定时线程肯定关系,因为我是秉着先理解问题再解决问题的心态,所以决定一步步搞懂问题是如何发生的。

 记一次使用android studio分析app闪退原因的过程


页面切换断点跟踪

因为是在页面切换的时候,发生闪退的,所以要从页面切换的时候寻找问题,首先要搞懂页面是如何切换的

1.点击首页的时候通过调用MrCar_PageJump跳转到并且传参home.htm,如下图:

记一次使用android studio分析app闪退原因的过程

2.MrCar_PageJump:由于不是web方式所以执行else的_ng_transferAPPMethod,如下图:

 记一次使用android studio分析app闪退原因的过程

 3._ng_transferAPPMethod:通过调用window.Android.AndroidTransfer进行页面跳转,这个应该是java注入到js里的一个window对象,供js调用java代码用的,如下图:

记一次使用android studio分析app闪退原因的过程

4.AndroidTransfer:回到java代码里确实看到有这个方法,并且对应的case调用了PageJump方法如下图:

记一次使用android studio分析app闪退原因的过程

5.PageJump:打断点跟踪到这里发现这才是真正的跳转地方,先是启动了个新的loginActivity,再把当前的loginActivity结束掉(java层大部分页面代码都是写在loginActivity里的),而具体打开的html页面还要根据参数里的jumpUrl决定(jumpUrl在步骤1就指定了),如下图:

记一次使用android studio分析app闪退原因的过程

 到此搞懂了页面直接是如何跳转的,只是方便我之后排查问题的时候更好的理解代码


定时线程断点跟踪

在观察日志的时候有说到问题反馈页面有个定时线程,我猜测问题就处在这个定时线程,所以跟踪下这个线程的执行流程,这里踩坑过程就不记录了,直接记录跟踪结果了

1.页面载入的时候执行PageInit初始化

记一次使用android studio分析app闪退原因的过程

2.PageInit调用GetDataFormAPP方法,回调方法是GetUserInfosCallback

记一次使用android studio分析app闪退原因的过程

 3.GetUserInfosCallback调用了GetUserLocation方法

 记一次使用android studio分析app闪退原因的过程

4.GetUserLocation里由于判断不是web模式,所以执行了MrCar_TransferAPPMethod方法,回调是GetCurrentLocationSucc

记一次使用android studio分析app闪退原因的过程

 5.GetCurrentLocationSucc中调用了GetStationInfosByPhone

记一次使用android studio分析app闪退原因的过程

6. GetStationInfosByPhone调用的java层的方法,路由参数是MrCarStartRssi

记一次使用android studio分析app闪退原因的过程

7.java层的case调用了,dispatcher的startLteInfoWithPermissionCheck

记一次使用android studio分析app闪退原因的过程

 8.startLteInfoWithPermissionCheck调用了loginactivity重写的startLteInfo

记一次使用android studio分析app闪退原因的过程

 9.startLteInfo调用了DoubleRSSITest类的exec方法

记一次使用android studio分析app闪退原因的过程

 10.成功的找到了这个每秒执行一次的定时线程,每秒调用一次handler.sendEmptyMessage方法

 记一次使用android studio分析app闪退原因的过程

11.提供了stop方法,以便外界结束这个定时线程

记一次使用android studio分析app闪退原因的过程

12.分析handler,在DoubleRSSITest的构造器里handler = new MyHandler,是一个继承关系的自定义handler

 记一次使用android studio分析app闪退原因的过程

重写了handleMessage方法,当收到消息后处理完消息,通过sendBroadcast方法将消息分发出去

 记一次使用android studio分析app闪退原因的过程

loginActivity先是注册了广播关键字my_local_broadcast,所以handler的广播消息会被转发到loginActivity的receiver里

记一次使用android studio分析app闪退原因的过程

ok,到这里就基本知道了这个定时线程的由来以及工作模式了,并且通过单词和注释知道了这个线程是在每秒刷新手机信号


空指针异常原因分析

其实闪退的时候日志里的保存信息,有指向到这个receiver里

记一次使用android studio分析app闪退原因的过程

就是因为这个切换页面的时候,phoneManger为null了,导致调用不到方法抛异常

记一次使用android studio分析app闪退原因的过程

于是我猜测页面切换的时候,有代码把phoneManager置为null了,结果我全局搜索并没有相关代码,所以肯定是别的原因为null了

记一次使用android studio分析app闪退原因的过程

接着分析,既然phoneManager不是人为的为null,肯定是自然为null,那么只有一种可能phoneManager对象在切换页面的时候被回收了,根据之前的页面跳转断点分析得知,跳转后会启动一个新的activity,然后当前的activity会执行finish方法,这个就会导致当前的activity里面的变量被销毁,从而导致这个定时线程收到消息后分发到revice里,再次访问phoneManager就会访问不到,最终导致报错闪退!binggo!脑子里瞬间就能把报错的过程推算出来了,就像看到了案发现场从而联想到作案手法!

 但是为什么activity都finish了,后台线程怎么会还在执行呢,经过分析,切换页面的时候确实执行了stop方法,线程应该停止,按理来说,不会发生这种情况的

记一次使用android studio分析app闪退原因的过程

后来经过复盘整个执行过程,页面切换的流程应该是:

 Finish(销毁变量)-> revice(消息回调)-> stop(停止发送)

说白了就是stop完了,在stop之前消息就已经到达了,但是变量又被finish销毁了,所以最终报空指针异常。整个流程一步步跟踪下来直到找到问题很有成就感


解决问题 

既然找到了问题,肯定就要解决问题,试过把stop放在onDestroy的第一句代码调用依然会有几率会报错,因为stop只是改变布尔变量值,并不能立即强制结束线程。所以只能在消息回调里做处理,在recever里加个判空判断,这样子在页面销毁后的最后一次消息回调就不会报错,因为被判空了,从而解决问题

记一次使用android studio分析app闪退原因的过程

前面分析了这么多代码,最后一个判空判断就搞定了,想想还挺搞笑的,但是没有前面的分析作为基础,我不一定能定位到这个地方,而且我是秉着先理解问题再解决问题的心态完成这件事的,这样才能学到东西


修复后效果演示

(因为是公司内部app,原有视频不做展示)

到了这里,关于记一次使用android studio分析app闪退原因的过程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Studio实现记单词App,背完四六级一次过~

    本系统包含高考、四级、六级、托福和雅思词汇五个章节。每个章节分为多个单元,每个单元又包含上百个词汇。可以在单元列表查询单词,实时记录每个单元的阅读时间,点进单词详情页,有单词的拼写、音标、释义和例句,底部导航栏可以查看前一页和后一页,还可以进

    2024年02月03日
    浏览(31)
  • 记一次使用git prune 命令的场景分析

    自动化测试团队在 Jenkins 上配置了用于运行自动化项目的 Job。今天,Job 在执行 git fetch 时报了下面的错误: 自动化团队成员无法解决此问题,于是,我这边帮忙阅读了 Job 的日志,使用 git prune 解决问题;找出了导致此异常场景的原因,并重现场景,让大家了解此场景,避免

    2024年02月03日
    浏览(23)
  • 记一次使用NetworkManager管理Ubuntu网络无效问题分析

    我们都知道CentOS、Redhat系列网络配置比较连贯,要么在 /etc/sysconfig/network-scripts/ifcfg-网络设备名 ,文件中编辑后,重启网络服务;要么使用 nmtui 或者 nmcli 进行配置。但是, Ubuntu变动就比较大: 早期 版本的Ubuntu,配置网络在 /etc/network/interfaces 下,后面这个文件就被遗弃了,

    2024年02月09日
    浏览(35)
  • 记一次dlopen使用问题导致Framework重启,tombstones、pmap与反汇编分析(上)

    :Android Framework 动态库 动态链接 Binder Android Studio一次更新后发现install App,设备就重启了,跑了一遍开机动画但不是从开机第一屏开始重启,tombstones内容查看发现是 surfaceflinger 挂在 libbinder.so ,那install app做了什么这个不得而知,理论上有问题应该挂的是PackageManager

    2024年04月08日
    浏览(35)
  • 记一次adb查找安卓App崩溃报错记录

    首先先说结论,是因为内存不足的时候会出现这种问题 在小米手机上有这么一个设置 可以很方面的模拟出这个异常 然后我们再设置一下logcat日志的大小 如果你的操作真的很多,最好设置一下,如果你的操作很短就可以复现,那就没必要调整,256k足矣 然后就是手机连接电脑

    2023年04月21日
    浏览(36)
  • Android Studio出现闪退

    We recommend using a newer Android Gradle plugin to use compileSdk = 34 This Android Gradle plugin (7.4.2) was tested up to compileSdk = 33 This warning can be suppressed by adding android.suppressUnsupportedCompileSdk=34 to this project’s gradle.properties The build will continue, but you are strongly encouraged to update your project to use a newer Andro

    2024年01月25日
    浏览(44)
  • 记一次用户反馈app在后台收不到push问题跟踪

            我们的应该大范围推广后,今日用户群好多用户反馈安卓手机app在后台时收不到app的push消息,只有app处于前台时才能收到push消息。但是ios手机可以正常接收push消息。         拿到问题,首先想到从下面几个方便尝试定位: 1.用户手机app通知权限配置是否正确; 2

    2024年02月06日
    浏览(32)
  • 记一次挖矿木马样本分析

    有一台vps被弱口令上马了 翻来翻去 找到个二进制文件如下 搜main函数可以判断是用shc加密shell脚本生成的二进制文件 在0000000000400F7E位置函数,找到了加载shell命令的位置 shc部分源码 尝试生成一个echo “helloworld”,看看shc生成的文件是什么构造 安装shc 加密后会得到一

    2024年01月25日
    浏览(27)
  • 记一次 腾讯会议 的意外崩溃分析

    前段时间在用 腾讯会议 直播的时候,居然意外崩溃了,还好不是在训练营上课,不然又得重录了,崩完之后发现 腾讯会议 的 bugreport 组件会自动生成一个 minidump,截图如下: 作为一个.NET高级调试的技术博主,非 .NET 的程序也得要研究研究哈😄😄😄,有了这个好奇心,也

    2023年04月20日
    浏览(67)
  • 记一次 .NET 某企业内部系统 崩溃分析

    前些天有位朋友找到我,说他的程序跑着跑着就崩溃了,让我看下怎么回事,其实没怎么回事,抓它的 crash dump 就好,具体怎么抓也是被问到的一个高频问题,这里再补一下链接: [.NET程序崩溃了怎么抓 Dump ? 我总结了三种方案] https://www.cnblogs.com/huangxincheng/p/14811953.html ,采用

    2024年02月10日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包