安卓源码避坑指南3——拨打电话的SIM卡无效导致蓝牙断连

它来了、它来了,它带着BUG赶来了,欢迎大家查看本期的安卓源码避坑指南。本期的问题场景比较特殊,电话SIM卡是无效的(欠费过期了,很是贫穷…)。

开开心心地上着班、摸着鱼(-_-),突然工作邮件提醒,一经查看原来是QA同学甩过来个问题。那咱就话不多说,先简单介绍下本篇的问题场景。

测试环境:Android 9的车机系统 + 手机中的SIM卡为无效SIM卡

测试步骤

  1. 车机和手机使用蓝牙相互连接成功
  2. 车机端主动拨打电话

测试现象:由于手机中SIM卡为无效电话卡所以电话拨打失败,但是几秒钟过后手机与车机间的蓝牙连接断开

当看到这么个场景+问题现象后,我是懵逼的。打个电话蓝牙连接就断开,这么牛逼的吗?经过分析logcat发现蓝牙服务进程号有改变,那问题原因指向就很明显了:

  • 用户主动开关蓝牙
  • 蓝牙服务crash

由于测试步骤中不涉及开关蓝牙操作,那肯定就是蓝牙服务进程crash。根据这个基本判断提取相关crash-log做进一步分析。

Process: com.android.bluetooth
PID: 21997
Flags: 0x30c8be45
Package: com.android.bluetooth v28 (9)
Foreground: No
Build:系统版本号(此处省略。。。)java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.headsetclient.profile.action.AG_CALL_CHANGED flg=0x10000010 (has extras) } in com.android.bluetooth.hfpclient.connserv.HfpClientConnectionService$1@72e6f2at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1401)at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)at android.os.Handler.handleCallback(Handler.java:873)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6718)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.bluetooth.BluetoothHeadsetClientCall.getNumber()' on a null object referenceat com.android.bluetooth.hfpclient.connserv.HfpClientConnection.finishInitializing(HfpClientConnection.java:92)at com.android.bluetooth.hfpclient.connserv.HfpClientConnection.<init>(HfpClientConnection.java:61)at com.android.bluetooth.hfpclient.connserv.HfpClientDeviceBlock.buildConnection(HfpClientDeviceBlock.java:253)at com.android.bluetooth.hfpclient.connserv.HfpClientDeviceBlock.handleCall(HfpClientDeviceBlock.java:169)at com.android.bluetooth.hfpclient.connserv.HfpClientConnectionService$1.onReceive(HfpClientConnectionService.java:122)at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1391)... 8 more

从以上问题log明显看到程序运行过程中遇到空指针调用从而引发com.android.bluetooth进程crash,导致蓝牙连接断开的问题根因crash找到了,那是怎么触发这个crash的呢?我们试着从源码分析下这块的流程。

首先查看snoop文件,由于问题产生时只有拨打电话的操作,所以分析下AT命令的交互:

从HCI上可以看出AT交互很简单,就是一条ATD指令请求拨打电话,由于手机SIM卡无效,10s手机回复了错误的AT命令。10s的时间设定是因为手机蓝牙服务HeadsetService. dialOutgoingCall( )在收到AT拨打电话指令后会给电话模块发送对应的广播并设置定时器:

手机端拨打电话10s超时后发送AT_RESPONSE_ERROR回复车机蓝牙,那车机收到这条错误指令后是怎么处理才导致crash了呢?咱就跟着程序分析下去,处理的时序图如下:

由于这个特殊场景使得HfpClientConnectionService对于这次拨打电话的操作而言第一次接收到的ACTION_CALL_CHANGED中call.state就是CALL_STATE_TERMINATED,从而初始化HfpClientConnection时调用了close()将mCurrentCall又置为空值,这样才遇到mCurrentCall.getNumber()对空指针取值引发crash。

分析到这里我们都知道mCurrentCall的值为空的原因了,那对应的解决方案就请大家集思广益在评论区一起交流讨论吧!

经过这样类似问题的回溯,我不禁对QA测试工程师越发佩服,因为使用的手机中SIM卡是无效卡的情况几乎不可能遇到,那对于本期分析的问题就很难被发现。正是QA们天马行空的魔鬼操作才让这些问题提前暴露出来,让蓝牙系统整体上更稳定,给测试大佬们敬茶 -_-。

本期是安卓源码避坑指南系列的第三篇文章了,想了解更多安卓源码bug的同学可以翻看以前的文章,也欢迎感兴趣的小伙伴私信留言共同学习。

更多互联互通技术,欢迎关注微信公众号:Connectivity

安卓源码避坑指南3——拨打电话的SIM卡无效导致蓝牙断开连接相关推荐

  1. 安卓源码避坑指南9—AVRCP连接状态异常

    AVRCP连接状态异常 安卓版本:android-9(P版本) 问题现象:断开设备,迟迟没有发出BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED的广播将 ...

  2. 安卓源码避坑指南10—蓝牙音乐播放状态和歌曲信息不更新

    蓝牙音乐播放状态和歌曲信息不更新 安卓版本:android-9 (P版本) 问题现象:歌曲信息和蓝牙音乐的播放状态不更新,蓝牙音乐界面感觉卡死(其实是界面信息不更新,音频数据正常) 歌曲信息和播放状态 ...

  3. mac下编译android源码避坑指南(新)

    截至目前mac环境下android源码编译最新避坑指南 避坑方法 配置(不说配置的都是耍流氓) 下载 编译 烧录 注意事项 避坑方法 源码.SDK.机型版本一定要清楚,有些特殊的版本需要特殊的方法,官 ...

  4. PCB设计--AD18导入二维码避坑指南

    最近准备在PCB尺上面放一个公众号二维码,但是怎么都不清晰,经过我两个晚上的摸索,终于试出来了,简单高效,绝对干货,网上绝大部分都是抄来抄去,省略了很多关键步骤,按照他的步骤不知道到何年马月才能出结果 ...

  5. Ubuntu18.04 编译Android 10源码 并烧录源码到pixel3的避坑指南

    Ubuntu18.04 编译Android 10源码 并烧录源码到pixel3的避坑指南 实验环境 下载Android源码树 在pixel3上安装手机驱动版本 编译Android源码 Android ...

  6. 速记:安卓Netty部署SSL/TLS和避坑指南

    速记:安卓Netty部署SSL/TLS和避坑指南 先按照 https://blog.csdn.net/russle/article/details/99086684 方法操作 第一步 生成服务器端私钥 ...

  7. android手机配什么蓝牙耳机,Airpods Pro搭配安卓手机+Windows电脑服用指南(避坑指南)...

    Airpods Pro搭配安卓手机+Windows电脑服用指南(避坑指南) 2019-12-17 16:01:32 57点赞 104收藏 75评论 创作立场声明:本篇内容仅基于本人AirPods Pr ...

  8. VMProtect SDK完全避坑指南

    文章目录 前言 编译VMProtect Demo 生成机器码 替换密钥对 生成序列号 总结 前言 在编写软件的时候,通常会有这样一个需求,需要对自己写的软件实现一机一码加密保护,并且最好能够限制使用时 ...

  9. python避坑指南_Linux下Python3.6的安装及避坑指南

    Python3的安装 1.安装依赖环境 Python3在安装的过程中可能会用到各种依赖库,所以在正式安装 Python 3之前,需要将这些依赖库先行安装好. yum -y install zlib-d ...

最新文章

  1. pretty_errors_python
  2. 网络营销专员浅析如何以低成本高获取实现网络营销?
  3. CSS3 Transitions 你可能不知道的知识点
  4. mysql主从位点保存时间_MySQL主从备份
  5. 连载:阿里巴巴大数据实践—实时技术
  6. java 蓝牙4.0_《蓝牙4.0 BLE开发完全手册---物联网开发技术实战
  7. 查找域内所有的Windows Server 2012 R2的服务器,并区分出哪些是物理机,那些是虚拟机...
  8. packetbeat mysql_简单使用packetbeat
  9. Vue第一部分(2): 数据的渲染
  10. OpenCV 编译 - Unable to locate package libjasper-dev
  11. 博达路由器如何配置互联网ip_如何成为技术大牛第七步——路由器下接交换机单臂路由配置方法...
  12. dataset的去重计数 g2_AntV 架构演进-G2 篇
  13. 双系统安装:Deepin 尝鲜
  14. Datalogic得利捷推出具有强大视觉系统功能的紧凑型智能相机P2X系列
  15. MODIS数据下载及批处理
  16. 用asp.net写的一个购物网站
  17. 微表情识别,C++实现,编译为动态链接库
  18. 积跬步,聚小流------具有滑动效果的导航
  19. 怎么判断两个多项式互素_关于两个多元多项式互素问题
  20. 不要一个人吃饭---人脉就是钱脉

热门文章

  1. 时至今日还能正常使用的几个网络收藏夹
  2. 长尾词推广系统推荐乐云seo_万词推广价格_乐云SEO
  3. 用python60行代码写一个简单的笔趣阁爬虫!三分一章?
  4. 计算机怎么连音乐,电脑如何连接蓝牙耳机听音乐_教你给电脑连接蓝牙耳机的方法-系统城...
  5. Elsevier爱思唯尔投稿步骤指南
  6. 《被讨厌的勇气》书摘心得之一切烦恼都来自人际关系(1)
  7. HTML2023新年源代码(炫酷动态烟花)
  8. 苹果手机相机黑屏怎么回事(苹果手机相机黑屏解决办法)
  9. 记一次外包项目微信接口开发流程-spring-boot
  10. 券商3月份金股名单揭晓 五大看点暗含春季行情“密码”?