本篇文章已授权微信公众号 guolin_blog(郭霖)独家发布
最近在进行一次测试用例中,发现测试手机在利用本地下载功能下载0K大小的文件时,进度条一直处于进度模糊状态中,虽然查看本地存储路径,发现文件已经存在,但是页面上并没有提示下载成功,此时只能对下载执行暂停或删除操作。最初只是怀疑是自身应用的问题,但是在试了自己的华为畅享5s(Android5.1)、联想S560(Android.4.2)(暴露贫穷了)及朋友的ZTE小鲜(Android6.0)、华为P9(Android7.0)等三款不同厂商的设备后,发现都有相同的现象,所以怀疑这是android自身的一个待优化点(说bug有点严重了,毕竟0K大小的文件谁会经常遇到呢)。在此基础上,对AOSP的DownloadProvider进行了一番研究,源码资源大家可以访问http://androidxref.com/,最新的Android Oreo源码也可以在上面查阅。
下面的调查以Android7.0和Android8.0的DownloadProvider源码为基础展开。将探讨两个问题:
(1)进度条样式为什么是进度模糊样式?
(2)0K文件是否真正意义上下载成功了?
Android的本地下载分为三部分:
1、frameworks/base/core/java/android/app/下的DownloadManager.java和frameworks/base/core/java/android/provider/下的Downloads.java
2、packages/apps/providers/下的DownloadProvider
3、frameworks/base/packages/下的DocumentsUI
其中,DocumentsUI就是我们常见的下载列表。而DownloadManager.java就是开放给开发者调用的下载器,也是系统自身使用的下载器,Downloads.java负责表路径和下载状态标记的管理,DownloadProvider负责下载过程中数据的处理和展示。鉴于ANDROID下载机制中,默认下载进度是以通知的形式展示的,所以我通过检索Notification,发现只在DownloadProvider中出现了调用,那么问题的根源可能就存在在DownloadProvider中。
DownloadProvider类目录结构如下: