现象
Android P的部分手机出现使用DownloadProvider下载文件时会出现通知栏不显示下载进度条的问题,相同手机不同版本会出现此问题
解决思路
由于使用DownloadProvider发送通知涉及到应用,DownloadProvider, NotificationManager, SystemUI。需要一个个进行排除
- 应用,再查看过应用使用的代码以及Google play下载应用也不在通知栏中显示进度条的现象应该与应用无关
- DownloadProvider,使用正常可以显示通知进度条的DownloadProvider替换依然出现这个问题,与之无关
- NotificationManager和SystemUI,这两个都需要进行调试,但问题在于代码太新,版本太老,直接编译会出现报错以及无法开机的问题
困难解决
困难点在于出问题的版本太老了,最新的版本中又没有此问题。所以需要回退到旧版本编译之前的代码,这里提供两种方式,一种是通过时间来判断,即手机中版本编译时间,另一种是版本发出之后的tag
#通过编译时间回退
repo forall -c 'commitID=`git log --before "2019-04-01 07:00" -1 --pretty=format:"%H"`; git reset --hard $commitID'
# 通过tag进行回退
# 要先进入某个仓库里面使用git tag找到对应的tag
repo forall -c git checkout -b new_branch_xxx XXX_HALO_2.1.2_L1_20181220(tag号)
问题定位
通过LOG定位问题最后发现是GoogleRestore这个应用会取消DownloadProvider的Notification,也不知道它是怎么获取到Notification的key的,具体取消的流程如下:
GoogleRestore->snoozeNotificationUntilContextFromListener()->snoozeNotificationInt()->mHandler.post(new SnoozeNotificationRunnable(key, duration, snoozeCriterionId))->snoozeLocked()->snoozeNotificationLocked()->cancelNotificationLocked()
这里有两点需要稍微注意一下:
- GoogleRestore使用的是REASON_SNOOZED进行取消,这个本是用来作为通知延迟显示的
- snoozeNotificationUntilContextFromListener()这个是定义在INotificationManager中,不会显示在SDK中,如果能够通过反射调用到NotificationManger中的getService(),其实是有机会调用这个方法。
总结
I hate GMS and Google