记录一次解决DownloadProvider下载不显示Notification的问题

938 阅读2分钟

现象

Android P的部分手机出现使用DownloadProvider下载文件时会出现通知栏不显示下载进度条的问题,相同手机不同版本会出现此问题

解决思路

由于使用DownloadProvider发送通知涉及到应用,DownloadProvider, NotificationManager, SystemUI。需要一个个进行排除

  1. 应用,再查看过应用使用的代码以及Google play下载应用也不在通知栏中显示进度条的现象应该与应用无关
  2. DownloadProvider,使用正常可以显示通知进度条的DownloadProvider替换依然出现这个问题,与之无关
  3. 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()

这里有两点需要稍微注意一下:

  1. GoogleRestore使用的是REASON_SNOOZED进行取消,这个本是用来作为通知延迟显示的
  2. snoozeNotificationUntilContextFromListener()这个是定义在INotificationManager中,不会显示在SDK中,如果能够通过反射调用到NotificationManger中的getService(),其实是有机会调用这个方法。

总结

I hate GMS and Google