
利益相关:MIUI 系统开发工程师,此次跟踪谷歌 GMS 异常问题的开发之一
首先,这个问题的表象:
升级 MIUI 9.5 稳定版后,如果使用者主动安装了谷歌框架及其"全家桶",手机将会产生耗电严重、闹钟微信无法正常提醒和 @灰机 同学提及到的各种 APP 层面的问题
权宜之计,可以暂时卸载谷歌框架 GMS。具体步骤可以参考 MIUI 论坛的相关告知
这个问题我们正在全力与谷歌沟通解决,未来 MIUI 也会增加此类测试,杜绝这类问题的发生
-------------------技术分析-------------------
从表面看,这个问题相当严重,看起来好像是 MIUI 整体的质量大幅度下滑,其实不然
如果做过系统开发的同学看到这个问题后,就应该会存有疑虑并开始怀疑:应该是某个重要的系统组件出现了问题
经过分析论坛中米粉们上传的日志,最后确认是谷歌 GMS 应用频繁的发送系统有序广播,并且常常伴有耗时,最终导致 Android 系统中的有序广播队列近于"瘫痪"。如此重要的组件被"攻陷"了,系统中其它 APP 自然也就无法正常使用,于是出现各种异常
我大概谈谈"广播"的概念,在Android 的世界中,广播是最重要 IPC (进程间通信) 方法,我们常用的闹钟响铃、微信提醒消息这些功能,或多或少都需要依赖它来实现。其中依赖最多的有序广播也叫串行广播,它的机制类似于大家在餐厅吃饭排队,只有前面的同学打完饭,后面的同学才可以到前面点餐
也就是说,如果闹钟响铃、微信提醒消息这两位同学想要打饭,就必须要排队到队伍的最前面去。但是如果它们所在队伍的前面有数千数万个其它同学在慢悠悠的打饭,那么就意味着闹钟要在数个小时后才能响铃,微信可能出现延迟提醒新消息提示的情况
这种因为某个 APP 异常,疯狂发送有序广播并耗时,导致其它 APP 也受到牵连的 BUG 其实在原生 Android 就存在
-------------------前方高能-------------------
以下我放出部分问题日志:
// 这里一共有 15382 个同学需要 "打饭",也就是说这么多广播等待被系统调度,这种现象极不正常,一般来说这个队伍中最多不超过 10 个
Active Ordered Broadcast background #15382:
BroadcastRecord{ee8d514 u0 com.google.android.gms.gcm.ACTION_SCHEDULE} to user 0
Intent { act=com.google.android.gms.gcm.ACTION_SCHEDULE flg=0x10 pkg=com.google.android.gms (has extras) }
...
Pending #0: (manifest)
priority=0 preferredOrder=0 match=0x108000 specificIndex=-1 isDefault=false
ActivityInfo:
name=com.google.android.gms.gcm.nts.SchedulerReceiver
packageName=com.google.android.gms
processName=com.google.android.gms.persistent
enabled=true exported=true directBootAware=false
resizeMode=RESIZE_MODE_RESIZEABLE
....
// 下面我们来看看队伍中最前面的 0 号"打饭"同学,他在 2018-03-24 12:07:30 开始排队,在 2018-03-24 18:46:57 才排队到队伍的前排,等待了 6 个小时之久
Active Ordered Broadcast background #0:
BroadcastRecord{8e94877 u0 com.google.android.gms.gcm.ACTION_SCHEDULE} to user 0
....
enqueueClockTime=2018-03-24 12:07:30 dispatchClockTime=2018-03-24 18:46:57
...
看完正在排队的同学,我们再看看已经"打到饭"的同学:
// gms 同学,在同一时间 2018-03-24 12:07:14,多次发出广播占用队列,耗时 7s+ 与 9s+。这个广播大致 1s 发送 6 个,但是系统处理这 6 个广播往往需要平均耗费 20s+ 的时间,以这样的速度堆积,也难怪后面的闹钟、微信等 APP 广播无法被系统处理
#21: act=com.google.android.gms.gcm.ACTION_SCHEDULE flg=0x10 pkg=com.google.android.gms (has extras)
+6h39m14s72ms dispatch +7s758ms finish
enq=2018-03-24 12:07:14 disp=2018-03-24 18:46:28 fin=2018-03-24 18:46:36
extras: Bundle[mParcelledData.dataSize=976]
#25: act=com.google.android.gms.gcm.ACTION_SCHEDULE flg=0x10 pkg=com.google.android.gms (has extras)
+6h39m4s561ms dispatch +9s191ms finish
enq=2018-03-24 12:07:14 disp=2018-03-24 18:46:19 fin=2018-03-24 18:46:28
extras: Bundle[mParcelledData.dataSize=964]
最后,因为 GMS 兼容性导致频繁发广播并耗时的问题,目前已经和谷歌联系,会尽快解决~
