1. 程式人生 > >Android系統Download模組研究

Android系統Download模組研究

一、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
  • 下載記錄儲存在/data/data/com.android.providers.downloads/databases/downloads.db
    ,有興趣的童鞋可以push出來看一看

未完待續……