Android 广播阻塞、延迟问题分析方法

一、问题

最近遇到一个问题,发送广播(普通广播)给另一个应用,但是广播需要要等约1min后才收到。

二、分析原因

原因是系统有个广播接收器在接收到广播后处理了接近50s,所以阻塞了后面的广播处理。如果大家也出现了广播阻塞问题,想知道广播到底堵塞到哪里?这里先给大家分享下这个问题分析方法:

1、首先,串口设置输出log转存到a.txt文件中(名字随意取),然后在串口打印下面的指令,等一会将所有的广播信息收集起来。

java 复制代码
dumpsys activity broadcasts

2、然后,根据自己堵塞的广播名称在a.txt文件进行过滤,如下代码所示,有三次发送。

java 复制代码
Line 10070:   #102: act=com.xx.xxx.SHUTDOWN flg=0x10 (has extras)
Line 10078:   #104: act=com.xx.xxx.SHUTDOWN flg=0x10 (has extras)
Line 11031:   #207: act=com.xx.xxx.SHUTDOWN flg=0x10 (has extras)

3、根据过滤出的三次广播信息,每一条挨个返回a.txt原log中查看下处理的时间,原log信息如下。从时间上看,第一次#207是正常的,在#104的时候出现了问题,耗时:50s426ms。

java 复制代码
#102: act=com.xx.xxx.SHUTDOWN flg=0x10 (has extras)
    +46s57ms dispatch +4ms finish
    enq=2023-08-09 11:20:36.769 disp=2023-08-09 11:21:22.826 fin=2023-08-09 11:21:22.830
    extras: Bundle[{STRIPPED=1}]
    
#104: act=com.xx.xxx.SHUTDOWN flg=0x10 (has extras)
    +50s426ms dispatch +4ms finish
    enq=2023-08-09 11:20:32.269 disp=2023-08-09 11:21:22.695 fin=2023-08-09 11:21:22.699
    extras: Bundle[{STRIPPED=1}]
    
#207: act=com.xx.xxx.SHUTDOWN flg=0x10 (has extras)
    0 dispatch +5ms finish
    enq=2023-08-09 11:19:06.225 disp=2023-08-09 11:19:06.225 fin=2023-08-09 11:19:06.230
    extras: Bundle[{STRIPPED=1}]

4、然后在a.txt文件过滤dispatch关键字,在第三步分析在#104的时候出现了问题,从第二步可以看到#104出现在Line 10078行,然后在过滤出的dispatch的信息中,找到10078行,然后往下找,找到第一个时间比较长的广播,从下面log看,应该是Line 10132行的广播堵塞了,返回a.txt文件可以找到对应的广播信息。

java 复制代码
Line 10071:     +46s57ms dispatch +4ms finish
Line 10075:     +48s292ms dispatch +127ms finish
Line 10079:     +50s426ms dispatch +4ms finish
Line 10083:     +53s166ms dispatch +121ms finish
...
Line 10132:     +48s652ms dispatch +43s360ms finish
Line 10135:     0 dispatch 0 finish
Line 10178:     0 dispatch +1ms finish

5、找到堵塞的广播后,以该广播为关键字在a.txt文件中再次进行筛选,可找到注册该广播的包名,进而可以找到堵塞的进程和应用。此时备注下log分析,把bug分出去就行了。这也是为啥,不能再onReceive中有耗时操作的原因。

相关推荐
守.护10 分钟前
云计算学习笔记——HTTP服务、NFS服务篇
笔记·学习·云计算
东风西巷13 分钟前
Don‘t Sleep:保持电脑唤醒,确保任务不间断
android·电脑·软件需求
tangweiguo0305198725 分钟前
FlutterActivity vs FlutterFragmentActivity:全面对比与最佳实践
android·flutter
wdfk_prog25 分钟前
[Linux]学习笔记系列 -- lib/dump_stack.c 栈回溯打印(Stack Trace Dumping) 内核调试与错误诊断的基石
linux·运维·服务器·c语言·笔记·学习
i.ajls28 分钟前
无监督学习,推荐系统以及强化学习笔记
笔记·学习·机器学习
dragoooon3436 分钟前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
葱段39 分钟前
【Flutter】TextField 监听长按菜单粘贴点击事件
android·flutter·dart
用户0940 分钟前
Gradle 现代化任务依赖方案
android·kotlin
向阳花开_miemie41 分钟前
Android音频学习(十七)——音频数据流转
学习·音视频
Brookty1 小时前
【算法】双指针(二)复写零
学习·算法