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