前兩天由於開發一個app更新的功能,我將從服務器下載的apk文件放在了內部存儲目錄(測試手機爲小米,路徑爲:data/user/0/packagename/files)下面,而後安裝的時候一直安裝不了,提示解析包出錯。後來查詢發現,安裝apk是調用了PackageInstaller,沒有相關權限,這個沒法獲取內部路徑,因此會安裝不了。藉機也複習了一遍Android下面存儲相關的知識點,特來總結一番。緩存
內部存儲位於系統中很特殊的一個位置,對於設備中每個安裝的 App,系統都會在 data/data/packagename/xxx 自動建立與之對應的文件夾。若是你想將文件存儲於內部存儲中,那麼文件默認只能被你的應用訪問到,且一個應用所建立的全部文件都在和應用包名相同的目錄下。也就是說應用建立於內部存儲的文件,與這個應用是關聯起來的。當一個應用卸載以後,內部存儲中的這些文件也被刪除。對於這個內部目錄,用戶是沒法訪問的,除非獲取root權限。bash
String fileDir = this.getFilesDir().getAbsolutePath();
String cacheDir = this.getCacheDir().getAbsolutePath();
複製代碼
通常狀況下,咱們獲取到的路徑爲data/data/packagename/xxx,小米手機下面打印出來的結果以下: 服務器
對於內部存儲路徑,咱們通常經過如下兩種方式獲取,內部存儲空間的獲取都須要使用Context:網絡
對應內部存儲的路徑爲: data/data/packagename/files,可是對於有的手機如:華爲,小米等獲取到的路徑爲:data/user/0/packagename/filesapp
對應內部存儲的路徑爲: data/data/packagename/cache,可是對於有的手機如:華爲,小米等獲取到的路徑爲:data/user/0/packagename/cache應用程序的緩存目錄,該目錄內的文件在設備內存不足時會優先被刪除掉,因此存放在這裏的文件是沒有任何保障的,可能會隨時丟掉。學習
針對於外部存儲比較容易混淆,由於在Android4.4之前,手機機身存儲就叫內部存儲,插入的SD卡就是外部存儲,可是在Android4.4之後的話,就目前而言,如今的手機自帶的存儲就很大,如今Android10.0的話,有的手機能達到256G的存儲,針對於這種狀況,手機機身自帶的存儲也是外部存儲,若是再插入SD卡的話也叫外部存儲,所以對於外部存儲分爲兩部分:SD卡和擴展卡內存測試
咱們經過一段代碼來獲取手機的外部存儲目錄,咱們用的測試手機是三星G4,帶有插入SD卡的:ui
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
File[] files = getExternalFilesDirs(Environment.MEDIA_MOUNTED);
for (File file : files) {
Log.e("file_dir", file.getAbsolutePath());
}
}
複製代碼
對於以上代碼,打印的結果以下: this
打印出兩行目錄,第一行目錄是機身自帶的外部存儲目錄,目錄結構爲:/storage/emulated/0/Android/data/packagename/files 第二行是存儲卡的目錄結構,路徑爲:/storage/extSdCard/Android/data/packagename/files此目錄路徑須要經過context來獲取,同時在app卸載以後,這些文件也會被刪除。相似於內部存儲。spa
對應外部存儲路徑:/storage/emulated/0/Android/data/packagename/cache
對應外部存儲路徑:/storage/emulated/0/Android/data/packagename/files
SD卡里面的文件是能夠被自由訪問,即文件的數據對其餘應用或者用戶來講都是能夠訪問的,當應用被卸載以後,其卸載前建立的文件仍然保留。
對於SD卡上面的文件路徑須要經過Environment獲取,同時在獲取前須要判斷SD的狀態:
MEDIA_UNKNOWN SD卡未知
MEDIA_REMOVED SD卡移除
MEDIA_UNMOUNTED SD卡未安裝
MEDIA_CHECKING SD卡檢查中,剛裝上SD卡時
MEDIA_NOFS SD卡爲空白或正在使用不受支持的文件系統
MEDIA_MOUNTED SD卡安裝
MEDIA_MOUNTED_READ_ONLY SD卡安裝可是隻讀
MEDIA_SHARED SD卡共享
MEDIA_BAD_REMOVAL SD卡移除錯誤
MEDIA_UNMOUNTABLE 存在SD卡可是不能掛載,例如發生在介質損壞
String externalStorageState = Environment.getExternalStorageState();
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)){
//sd卡已經安裝,能夠進行相關文件操做
}
複製代碼
對應外部存儲路徑:/storage/emulated/0
獲取外部存儲的共享文件夾路徑如:
DIRECTORY_MUSIC 音樂目錄
DIRECTORY_PICTURES 圖片目錄
DIRECTORY_MOVIES 電影目錄
DIRECTORY_DOWNLOADS 下載目錄
DIRECTORY_DCIM 相機拍照或錄像文件的存儲目錄
DIRECTORY_DOCUMENTS 文件文檔目錄
String externalStoragePublicDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();
複製代碼
以上即是獲取相機DCIM目錄,對應獲取的路徑爲:/storage/emulated/0/DCIM。
對應獲取系統分區根路徑:/system
對應獲取用戶數據目錄路徑:/data
對應獲取用戶緩存目錄路徑:/cache
這兩個都位於內部存儲目錄/data/data/packagename/下面,位於同一級別,前者是file目錄下面,後面是cache目錄下。
前者位於內部存儲目錄/data/data/packagename/file下面,後者位於外部存儲目錄/storage/emulated/0/Android/data/packagename/files下面,它們都存在於應用包名下面,也就是說屬於app應用的,因此當app卸載後,它們也會被刪除的。
對於前面提到的app下載升級功能,咱們從服務器端下載的app須要放到外部存儲目錄下面,而不是內部存儲目錄,由於內部存儲目錄的空間很小。另外我也作了相關測試,若是將apk放到內部存儲目錄file下面的話,安裝時會出現問題,提示解析包出錯。
在app中有清除數據和清除緩存這兩個概念,那麼這二者分別清除的是什麼目錄下面的數據呢?
清除數據清除的是保存在app中全部數據,就是上面提到的位於packagename下面的全部文件,包含內部存儲(/data/data/packagename/)和外部存儲(/storage/emulated/0/Android/data/packagename/)。固然除了SD卡上面的數據,SD卡上面的數據當app卸載以後還會存在的。
緩存是程序運行時的臨時存儲空間,它能夠存放從網絡下載的臨時圖片,從用戶的角度出發清除緩存對用戶並無太大的影響,可是清除緩存後用戶再次使用該APP時,因爲本地緩存已經被清理,全部的數據須要從新從網絡上獲取。爲了在清除緩存的時候可以正常清除與應用相關的緩存,請將緩存文件存放在getCacheDir()或者 getExternalCacheDir()路徑下。
以上即是Android系統中管存儲目錄的一些知識。
專一於 Android 開發多年,喜歡寫 blog 記錄總結學習經驗,blog 同步更新於本人的公衆號,歡迎你們關注,一塊兒交流學習~