Android系統Download模組研究
阿新 • • 發佈:2019-01-13
一、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下載流程圖分析
解決思路
修改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
- 下載記錄儲存在/data/data/com.android.providers.downloads/databases/downloads.db
,有興趣的童鞋可以push出來看一看
未完待續……