手機(jī)應(yīng)用管理中,每個(gè)App下都有清除數(shù)據(jù)和清除緩存,清除的分別是哪里的數(shù)據(jù)?
/data /mnt /sdcard /storage 的區(qū)別和聯(lián)系
內(nèi)存,內(nèi)部存儲(chǔ),外部存儲(chǔ),很多人常常將這三個(gè)東西搞混,能說清這三個(gè)東西是怎么回事不?
參考博客:
徹底理解android中的內(nèi)部存儲(chǔ)與外部存儲(chǔ)
Android內(nèi)存解析(二)— 詳解內(nèi)存,內(nèi)部存儲(chǔ)和外部存儲(chǔ)
一個(gè)文件夾是app文件夾,還有一個(gè)文件夾就是data文件夾,app文件夾里存放著我們所有安裝的app的apk文件,其實(shí),當(dāng)我們調(diào)試一個(gè)app的時(shí)候,可以看到控制臺(tái)輸出的內(nèi)容,有一項(xiàng)是uploading .....就是上傳我們的apk到這個(gè)文件夾,上傳成功之后才開始安裝。另一個(gè)重要的文件夾就是data文件夾了,這個(gè)文件夾里邊都是一些包名,打開這些包名之后我們會(huì)看到這樣的一些文件:
1.data/data/包名/shared_prefs
2.data/data/包名/databases
3.data/data/包名/files
4.data/data/包名/cache
如果打開過data文件,應(yīng)該都知道這些文件夾是干什么用的,我們?cè)谑褂胹haredPreferenced的時(shí)候,將數(shù)據(jù)持久化存儲(chǔ)于本地,其實(shí)就是存在這個(gè)文件中的xml文件里,我們App里邊的數(shù)據(jù)庫文件就存儲(chǔ)于databases文件夾中,還有我們的普通數(shù)據(jù)存儲(chǔ)在files中,緩存文件存儲(chǔ)在cache文件夾中,存儲(chǔ)在這里的文件我們都稱之為內(nèi)部存儲(chǔ)。

? ? ? ?整個(gè)存儲(chǔ)空間分為內(nèi)部存儲(chǔ)和外部存儲(chǔ)兩部分,內(nèi)部存儲(chǔ)中又包含RAM和ROM等部分
1.?內(nèi)存
? ? ? ?RAM,即常說的運(yùn)行時(shí)內(nèi)存,是手機(jī)運(yùn)行時(shí)存儲(chǔ)數(shù)據(jù)和指令的地方,注意是運(yùn)行時(shí)內(nèi)存。
? ? ? ? ROM,用來存放一些系統(tǒng)文件,應(yīng)用配置和其他數(shù)據(jù)的地方,是內(nèi)部存儲(chǔ)中主要存儲(chǔ)區(qū)域。
2.?內(nèi)部存儲(chǔ)
????????內(nèi)部存儲(chǔ),即InternalStorage,也常說內(nèi)置存儲(chǔ)卡,這是手機(jī)內(nèi)置的存儲(chǔ)空間,出廠時(shí)就被確定,是手機(jī)的一個(gè)硬件指標(biāo)。
3.?外部存儲(chǔ)
????????外部存儲(chǔ),即ExternalStorage,也常說外置存儲(chǔ)卡,手機(jī)出廠時(shí)并不存在,是由用戶自由擴(kuò)展的存儲(chǔ)空間,常見的就是SD卡。
4.?data目錄
????????/data/app文件夾下存放三方應(yīng)用的apk文件;
????????/data/data文件夾下存放系統(tǒng)應(yīng)用和三方應(yīng)用的包私有數(shù)據(jù),每個(gè)應(yīng)用都有獨(dú)屬于自己的包。
5.?/mnt/sdcard/storage包
????????/mnt/sdcard是Android2.2及之上版本使用;
? ? ? ? ?/sdcard是Android2.1及之下版本使用。
???????以內(nèi)置存儲(chǔ)卡來說?,通常用sdcard0表示:
? ? ? ? ?Android4.1上,首先掛載到目錄/storage/sdcard0上面,/sdcard和/mnt/sdcard都只是指向/storage/sdcard0的軟鏈接;
????????Android4.2上,首先掛載到目錄/storage/emulated/0(0就表示內(nèi)置存儲(chǔ))上面,為兼容之前版本,又掛載到/storage/emulated/legency上面,/storage/sdcard0、/sdcard和/mnt/sdcard都只是指向/storage/emulated/legency的軟鏈接。(掛載相當(dāng)于真正位置,軟鏈接相當(dāng)于指針)。?
? ? ?Google官方建議開發(fā)者將App的數(shù)據(jù)存儲(chǔ)在私有目錄即/storage/emulated/0/Android/data包下,這樣卸載App時(shí)數(shù)據(jù)會(huì)隨之被系統(tǒng)清除,不會(huì)造成數(shù)據(jù)殘留。
? ? 所有的Android設(shè)備都有兩塊存儲(chǔ)區(qū)域:Internal Storage和External Storage。它們的名稱來源于早期的Android系統(tǒng),那時(shí)候大家的手機(jī)都內(nèi)置(Permanent)一塊較小存儲(chǔ)板(即Internal Storage),并配上一個(gè)的外置的(Removable)儲(chǔ)存卡(即External Storage)。后來部分手機(jī)開始將最初定義的“Internal Storage”,即內(nèi)置存儲(chǔ),分成Internal和External兩部分。這樣一來就算沒有外置儲(chǔ)存,手機(jī)也有Internal和External兩塊存儲(chǔ)區(qū)域。
? ?這個(gè)Primary和Secondary是怎么來的呢?實(shí)際上最開始Android也沒有考慮這個(gè)區(qū)分,但是后來有一個(gè)情況發(fā)生了,就是上面所說到的:后來部分手機(jī)開始將最初定義的“Internal Storage”,即內(nèi)置存儲(chǔ),分成Internal和External兩部分。那么如果這個(gè)時(shí)候手機(jī)再插入sd卡,那不是有多個(gè)External Storage了嗎? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 這個(gè)時(shí)候,從Internal Storage里面分出來的那塊“External Storage”我們稱之為主存儲(chǔ)(Primary Storage),插入的外置儲(chǔ)存稱之為副存儲(chǔ)(Secondary Storage)。主存儲(chǔ)路徑的獲取方式非常簡(jiǎn)單,可以通過Environment.getExternalStorageDirectory()或者Context.getExternalFilesDir(null)來獲取。副存儲(chǔ)路徑在4.4及以上的Android系統(tǒng)中,可以使用Context.getExternalFilesDirs(null)(注意最后多了一個(gè)’s’),它返回的是一個(gè)字符串?dāng)?shù)組。第0個(gè)就是主存儲(chǔ)路徑,第1個(gè)是副存儲(chǔ)路徑(如果有的話)。在4.4及以下系統(tǒng)中,的副存儲(chǔ)的獲取方式就是一個(gè)大坑了,一個(gè)一個(gè)介紹一下筆者看到過的方法。
副儲(chǔ)存路徑-StorageManager
? ? ?在Android中可以通過context.getSystemService(STORAGE_SERVICE)來獲取到StorageManager,但是很可惜的是,它里面有價(jià)值的方法都是hide的。慶幸的是還有反射。我們可以調(diào)用getVolumeList()函數(shù),這個(gè)返回的List里面,主存儲(chǔ)是第0個(gè),副存儲(chǔ)(如果有的話)是第1個(gè)。你可以看到Environment.getExternalStorageDirectory()里面就是用它實(shí)現(xiàn)的,可以說這個(gè)方法是目前最穩(wěn)妥的。它通過系統(tǒng)的MountService來獲取已mount上來的設(shè)備,并且能夠通過StorageVolume知道該存儲(chǔ)是否removable、是否是emulated、mount狀態(tài)等等。涉及到存儲(chǔ),由于Android rom千奇百怪,不可能是萬全的。如果反射出來的方法缺少變量、方法,或者有別的什么坑,那只能試一下其他方法來保底。靠譜程度:99%
?清除緩存:將外部私有數(shù)據(jù)下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,將內(nèi)部數(shù)據(jù)下的cache包下的內(nèi)容(/data/data/包名/cache)清除 。
清除數(shù)據(jù):將外部私有數(shù)據(jù)包(/storage/emulated/0/Android/data/包名)清除,將內(nèi)部數(shù)據(jù)下的所有內(nèi)容(/data/data/包名)清除;而兩種操作對(duì)外部公有數(shù)據(jù)均無影響。