Android?文件存儲(chǔ)系統(tǒng)原理
存儲(chǔ)的可選項(xiàng)
Android 的文件系統(tǒng)類似于其他平臺(tái)的基于磁盤的文件系統(tǒng)。包括以下幾種存儲(chǔ)類別:
- App 私有的存儲(chǔ)空間
- 共享的存儲(chǔ)空間
- Preferences,以 key-value 的形式存儲(chǔ)一些原始的內(nèi)容,如 SharedPreferences。
- 數(shù)據(jù)庫
不同的存儲(chǔ)類別扮演了不同的角色,比如 App 的私有存儲(chǔ)空間是無法被外部訪問的,可以用來存儲(chǔ)一些 App 私有的敏感信息;共享的存儲(chǔ)空間可以存儲(chǔ)一些所有應(yīng)用都可以訪問的文件,例如媒體、文檔等可公開的文件;數(shù)據(jù)庫則是用來處理持久化的;Preferences 用來存儲(chǔ)一些本地字段。
存儲(chǔ)位置的劃分
Android 系統(tǒng)的文件存儲(chǔ)位置劃分為兩大類:內(nèi)部存儲(chǔ)空間和外部存儲(chǔ)空間 ,其中,外部存儲(chǔ)空間又包括 App 私有目錄和公共目錄。
在大多數(shù)設(shè)備上,內(nèi)部存儲(chǔ)空間是小于外部的,但是內(nèi)部存儲(chǔ)空間是始終可以使用的,與之相反,一些可以插 SD 卡的設(shè)備的外部存儲(chǔ)空間是可以拓展的,所以意味著 SD 卡這部分存儲(chǔ)空間不是始終可用的。
內(nèi)部存儲(chǔ)空間
內(nèi)部存儲(chǔ)空間是 App 私有的存儲(chǔ)數(shù)據(jù)的存儲(chǔ)空間,系統(tǒng)會(huì)阻止其他應(yīng)用對(duì)這部分?jǐn)?shù)據(jù)的訪問,并且在 Android 10(API 級(jí)別 29)及更高版本中,系統(tǒng)會(huì)對(duì)這些位置進(jìn)行加密。 內(nèi)部存儲(chǔ)空間的特性讓它很適合存儲(chǔ)只有 App 本身才能訪問的敏感數(shù)據(jù)。
內(nèi)部存儲(chǔ)空間可以通過Context.getFileDir()
或Context.getCacheDir()
獲取到,主要路徑是:
Context.getFileDir() 獲取的路徑為: - data/data/packagename/files (部分手機(jī)廠商) - data/user/0/packagename/files (部分手機(jī)廠商) Context.getCacheDir() 獲取的路徑為: - data/data/packagename/cache (部分手機(jī)廠商) - data/user/0/packagename/cache (部分手機(jī)廠商)
外部存儲(chǔ)空間
外部存儲(chǔ)空間包括 App 私有目錄和公共目錄。
- App 私有目錄: App 的私有目錄指其他應(yīng)用可以訪問當(dāng)前應(yīng)用該目錄下的數(shù)據(jù),應(yīng)用卸載后也會(huì)隨之刪除。
- 公共目錄:外部可以自由訪問,應(yīng)用刪除后這部分存儲(chǔ)的數(shù)據(jù)不會(huì)刪除。
App 私有目錄
// 可以通過以下函數(shù)獲取 Context.externalCacheDir Context.externalCacheDirs Context.getExternalFilesDir(String) Context.getExternalFilesDirs(String) Context.externalMediaDirs
對(duì)應(yīng)的目錄是:
externalCacheDir: /storage/emulated/0/Android/data/com.chunyu.workdemo/cache externalCacheDirs: /storage/emulated/0/Android/data/com.chunyu.workdemo/cache ExternalFilesDir: /storage/emulated/0/Android/data/com.chunyu.workdemo/files ExternalFilesDirs: /storage/emulated/0/Android/data/com.chunyu.workdemo/files externalMediaDirs: /storage/emulated/0/Android/media/com.chunyu.workdemo
這里的com.chunyu.workdemo
是 packageName。
外部公共目錄
不要被這里的“外部”這個(gè)詞弄糊涂了。最好將此目錄視為媒體/共享的存儲(chǔ)部分。它是一個(gè)文件系統(tǒng),可以保存相對(duì)大量的數(shù)據(jù),并且在所有應(yīng)用程序之間共享(不強(qiáng)制執(zhí)行權(quán)限)。傳統(tǒng)上這是一張 SD 卡,但它也可以作為設(shè)備中的內(nèi)置存儲(chǔ)實(shí)現(xiàn),與受保護(hù)的內(nèi)部存儲(chǔ)不同,并且可以作為文件系統(tǒng)安裝在計(jì)算機(jī)上。
在具有多個(gè)用戶的設(shè)備上(如 UserManager 所述),每個(gè)用戶都有自己的隔離共享存儲(chǔ)。應(yīng)用程序只能訪問它們正在運(yùn)行的用戶的共享存儲(chǔ)。
獲取方式:
Environment.getExternalStorageState() // SD 卡狀態(tài) Environment.getExternalStorageDirectory() Environment.getExternalStoragePublicDirectory(String)
輸出內(nèi)容:
getExternalStorageState: mounted // 已掛載
getExternalStorageDirectory: /storage/emulated/0
getExternalStoragePublicDirectory: /storage/emulated/0
getExternalStorageDirectory
和getExternalStoragePublicDirectory
已經(jīng)被標(biāo)記為棄用,可以使用Context.getExternalFilesDir(String)
、MediaStore 或Intent.ACTION_OPEN_DOCUMENT
等替代方案,它們性能更好。
在上述的需要傳遞 String 參數(shù)的方法中,例如Context.getExternalFilesDir(String)
和getExternalStoragePublicDirectory(String)
,String 有以下幾個(gè)常量值:
> DIRECTORY_MUSIC // 音樂 > DIRECTORY_PODCASTS // 博客 > DIRECTORY_RINGTONES // 鈴聲 > DIRECTORY_ALARMS // 鬧鐘 > DIRECTORY_NOTIFICATIONS // 通知 > DIRECTORY_PICTURES // 圖片 > DIRECTORY_MOVIES // 電影 > DIRECTORY_DOWNLOADS // 下載 > DIRECTORY_DCIM // 照片 > DIRECTORY_DOCUMENTS // 文檔
不能傳遞空值。
系統(tǒng)目錄
Environment 還提供了對(duì)一些系統(tǒng)目錄的訪問方法:
Environment.getRootDirectory() // 系統(tǒng)分區(qū)的 root 路徑 Environment.getDataDirectory() // 獲取用戶數(shù)據(jù)目錄的路徑 Environment.getDownloadCacheDirectory() // 獲取用戶緩存目錄的路徑 // 輸出為 getRootDirectory: /system getDataDirectory: /data getDownloadCacheDirectory: /data/cache
清除數(shù)據(jù)和清除緩存
在 App 中,從上面的方法名中我們也能體會(huì)到 cache 和 file 兩種路徑,應(yīng)該有不同的作用。
清除數(shù)據(jù)
清除數(shù)據(jù)清除的是保存在app中所有數(shù)據(jù),就是上面提到的位于 packageName 下面的所有文件,包含內(nèi)部存儲(chǔ)/data/data/packagename/
和外部存儲(chǔ) /storage/emulated/0/Android/data/packagename/
。
清除緩存
緩存是程序運(yùn)行時(shí)的臨時(shí)存儲(chǔ)空間,它可以存放從網(wǎng)絡(luò)下載的臨時(shí)圖片,從用戶的角度出發(fā)清除緩存對(duì)用戶并沒有太大的影響,但是清除緩存后用戶再次使用該APP時(shí),由于本地緩存已經(jīng)被清理,所有的數(shù)據(jù)需要重新從網(wǎng)絡(luò)上獲取。為了在清除緩存的時(shí)候能夠正常清除與應(yīng)用相關(guān)的緩存,請(qǐng)將緩存文件存放在getCacheDir()
或者getExternalCacheDir()
路徑下。
數(shù)據(jù)管理權(quán)限
某些應(yīng)用的使用場(chǎng)景時(shí)需要廣泛訪問設(shè)備上的文件,但無法采用注重隱私保護(hù)的存儲(chǔ)最佳做法高效地完成這些操作。對(duì)于這些情況,Android 提供了一種名為“所有文件訪問權(quán)限”的特殊應(yīng)用訪問權(quán)限。 例如,防病毒應(yīng)用的主要場(chǎng)景可能是需要定期掃描不同目錄中的許多文件。如果此掃描需要反復(fù)的用戶交互,讓用戶使用系統(tǒng)文件選擇器選擇目錄,可能就會(huì)帶來糟糕的用戶體驗(yàn)。其他場(chǎng)景(如文件管理器應(yīng)用、備份和恢復(fù)應(yīng)用以及文檔管理應(yīng)用)可能也需要考慮類似情況。
應(yīng)用可以通過執(zhí)行以下操作向用戶請(qǐng)求“所有文件訪問權(quán)限”:
- 在清單中聲明
MANAGE_EXTERNAL_STORAGE
權(quán)限。 - 使用
ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
設(shè)置 Intent ,將用戶引導(dǎo)至一個(gè)系統(tǒng)設(shè)置頁面,在該頁面上,用戶可以為您的應(yīng)用啟用以下選項(xiàng):授予所有文件的管理權(quán)限。可以通過Environment.isExternalStorageManager()
方法來檢查是否已獲得這個(gè)權(quán)限。
MANAGE_EXTERNAL_STORAGE
會(huì)授予以下權(quán)限:
- 對(duì)公共目錄中所有文件的讀寫權(quán)限。
- 對(duì)
MediaStore.Files
表的內(nèi)容的訪問權(quán)限。 - 除
/Android/data/
、/sdcard/Android
和/sdcard/Android
大多數(shù)子目錄外,對(duì)所有內(nèi)部存儲(chǔ)目錄?的寫入權(quán)限。
獲得此權(quán)限的應(yīng)用仍然無法訪問屬于其他應(yīng)用的內(nèi)部存儲(chǔ)空間,因?yàn)檫@些目錄在存儲(chǔ)卷上顯示為 Android/data/ 的子目錄。
到此這篇關(guān)于Android 文件存儲(chǔ)系統(tǒng)原理的文章就介紹到這了,更多相關(guān)Android 文件存儲(chǔ) 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android AsyncTask用法巧用實(shí)例代碼
這篇文章主要介紹了Android AsyncTask用法巧用實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-01-01關(guān)于Android中Gradle和jar包下載慢的問題及解決方法
這篇文章主要介紹了解決Android中Gradle和jar包下載慢的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Flutter實(shí)現(xiàn)仿微信分享功能的示例代碼
Flutter 用來快速開發(fā) Android iOS平臺(tái)應(yīng)用,在Flutter 中,通過 fluwx或者fluwx_no_pay 插件可以實(shí)現(xiàn)微信分享功能,本文將具體介紹實(shí)現(xiàn)的示例代碼,需要的可以參考一下2022-01-01Android ExpandableRecyclerView使用方法詳解
這篇文章主要為大家詳細(xì)介紹了Android ExpandableRecyclerView的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08Flutter實(shí)現(xiàn)切換應(yīng)用時(shí)隱藏應(yīng)用預(yù)覽
如果您要顯示敏感數(shù)據(jù),例如錢包金額,或者只是當(dāng)?shù)卿洷韱物@示插入的密碼清晰時(shí),當(dāng)您不在應(yīng)用程序中時(shí),您必須隱藏敏感數(shù)據(jù)。本文將利用Flutter實(shí)現(xiàn)切換應(yīng)用時(shí)隱藏應(yīng)用預(yù)覽,需要的可以參考一下2022-06-06Android studio git創(chuàng)建與刪除標(biāo)簽(Tag)的教程詳解
這篇文章主要介紹了Android studio git創(chuàng)建與刪除標(biāo)簽(Tag)的教程詳解,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Android應(yīng)用中使用ViewPager和ViewPager指示器來制作Tab標(biāo)簽
這篇文章主要介紹了Android中使用ViewPager和ViewPager指示器來制作Tab標(biāo)簽的方法,ViewPager指示器ViewPageIndicator是一個(gè)開源庫,文中舉了一個(gè)仿網(wǎng)易新聞客戶端Tab標(biāo)簽的例子,需要的朋友可以參考下2016-03-03Android入門之TableLayout應(yīng)用解析(一)
這篇文章主要介紹了Android入門之TableLayout應(yīng)用,需要的朋友可以參考下2014-08-08