一、Download模塊簡介##
首先,Android Download模塊主要由兩個部分構成:DownloadManager以及DownloadProvider。
- DownloadManager:在Android L/M源碼位置:frameworks/base/core/java/android/app/DownloadManager.java作用:提供接口供三方apk調用
- DownloadManager在Android L/M源碼位置:packages/providers/DownloadProvider/作用:具體下載的實現,包括相關文件下載信息的保存以及文件的下載。
二、DownloadManager介紹##
1、靜態內部類####
DownloadManager是系統開放給第三方應用使用的類,包含兩個靜態內部類 -DownloadManager.Query和DownloadManager.Request。
- DownloadManager.Request用來請求一個下載
- DownloadManager.Query 用來查詢下載信息
2、主要方法####
DownloadManager主要提供了一下主要方法:
- enqueue(Request request):執行下載,返回downloadId,downloadId可用于查詢下載信息。
- remove(long ids):刪除下載,若下載中取消下載。會同時刪除下載文件和記錄。
- query(Query query)查詢下載信息
- getMaxBytesOverMobile(Context context)通過移動網絡下載的最大字節數
- getMimeTypeForDownloadedFile(long id)得到下載的mineType
三、DownloadProvider分析##
1、DownloadManager主要類介紹####
- DownloadProvider:將下載信息insert到DB,啟動下載服務類DownloadService
- DownloadService:下載服務類,調用下載信息類DownlaodInfo,如果信息存在,則更新;否則,則新建該對象
- DownloadInfo:下載信息類,啟動下載線程類DownloadThread
- DownloadThread:下載線程類,真正負責下載的線程,每次啟動一個任務都會創建一個新的下載線程對象。進行下載前的過程檢查、網絡監測、路徑檢查等,保存文件……
2、下載流程分析####
下載流程時序圖
下載流程時序圖
四、案例分析##
1、問題描述###
插入SD卡,將默認存儲設置為SD卡,重啟后進入Play Store,Facebook無法更新,下載pokemon go等應用,下載失敗。
2、問題分析###
根據相應的Log分析,下載路徑無效。根據系統Environment.java文件,應該動態實現下載路徑的切換。
X項目默認存儲方案是可動態獲取路徑的:
- 當默認存儲為內部存儲時,有效路徑應該為/storage/emulated/0/Android/data/……
- 當默認存儲為SD卡時,有效路徑應該為/storage/sdcard1/Android/data/……
3、解決方案###
Play store下載流程圖分析####
Play store下載流程圖分析
解決思路
修改DownloadProvider類中insert(),確保下載記錄的hint,data字段值正確從上面的流程圖分析,思路就很明確了。當默認存儲為SD卡時,在DownloadProvider.java中執行insert數據庫之前,進行更新文件路徑。將play store傳給downloadProivder的無效路徑(storage/emulated/0 )修改為storage/sdcard1,確保存儲到數據庫中的地址是有效的文件路徑。
Some Tips###
- Chrome,Play Store這些三方apk調用的都是系統自帶的DownLoad模塊下載數據。
- Play Store下載apk后,自動刪除apk
- Downlaod記錄保存在
/data/data/com.android.providers.downloads/databases/downloads.db,有興趣的童鞋可以push出來看一看
未完待續……