Android內(nèi)存和外存的學(xué)習(xí)

手機(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ǔ)

Android存儲(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ǔ)。


Environment類和Context類相關(guān)方法測(cè)試


? ? ? ?整個(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ù)均無影響。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容