Android内存解析(二)— 详解内存,内部存储和外部存储
總述
覺得十分有必要搞清楚內(nèi)存,內(nèi)部存儲和外部存儲的區(qū)別,還有我們在開發(fā)中真正將數(shù)據(jù)存在了手機(jī)的哪兒。
先提一個問題:手機(jī)設(shè)置的應(yīng)用管理中,每個App下都有清除數(shù)據(jù)和清除緩存,清除的分別是哪里的數(shù)據(jù)?
一?? 內(nèi)存,內(nèi)部存儲和外部存儲
1. 可對Android手機(jī)存儲空間做如下劃分:
????????????????????????????????????????????????
整個存儲空間分為內(nèi)部存儲和外部存儲兩部分,內(nèi)部存儲中又包含RAM和ROM等部分。
2. 具體概念區(qū)分
內(nèi)部存儲,即InternalStorage,也常說內(nèi)置存儲卡,這是手機(jī)內(nèi)置的存儲空間,出廠時就被確定,是手機(jī)的一個硬件指標(biāo)。類比電腦的內(nèi)存。
外部存儲,即ExternalStorage,也常說外置存儲卡,手機(jī)出廠時并不存在,是由用戶自由擴(kuò)展的存儲空間,常見的就是SD卡。類比電腦的外接移動硬盤。
RAM,即常說的運(yùn)行時內(nèi)存,是手機(jī)運(yùn)行時存儲數(shù)據(jù)和指令的地方,注意是運(yùn)行時內(nèi)存。類比電腦的內(nèi)存條。
ROM,用來存放一些系統(tǒng)文件,應(yīng)用配置和其他數(shù)據(jù)的地方,是內(nèi)部存儲中主要存儲區(qū)域。類比于Windows電腦的C盤。
3. 以小米的紅米手機(jī)系列為例,打開設(shè)置中的關(guān)于手機(jī)一項(xiàng),可以看到下圖:
??????????????????????????????????????????? ? ? ? ?? ????????
上圖中運(yùn)行內(nèi)存即RAM,共2G,機(jī)身存儲即內(nèi)部存儲,共8G。
打開手機(jī)的文件管理,再點(diǎn)擊手機(jī)一項(xiàng),可以看到下圖:
???????????????????????????????????????????????????????????????
上圖中箭頭所指的地方,可以進(jìn)行內(nèi)部存儲與外部存儲的切換,當(dāng)前頁為內(nèi)部存儲下的展示,這只是android系統(tǒng)存儲數(shù)據(jù)的一部分而已,大部分?jǐn)?shù)據(jù)都對用戶隱藏。至于紅框部分下面繼續(xù)講。
二 詳說存儲
一般來說,App軟件大都安裝在內(nèi)部存儲的ROM區(qū),當(dāng)然現(xiàn)在也有辦法安裝在SD卡上,但這需要App自身支持及SD卡分區(qū)等一系列操作,下面討論的App是安裝在ROM區(qū)的。
1. 完整目錄結(jié)構(gòu)
以Genymotion模擬器設(shè)備為例來分析,型號是三星GalaxyS5。直接使用AndroidStudio的DDMS,打開File Explorer,我們可以看到下圖:
? ? ? ? ? ? ? ? ???????????????????? ??
這張圖是手機(jī)根目錄下的完整目錄結(jié)構(gòu)圖,內(nèi)外部存儲均包含在內(nèi)。不過有些文件內(nèi)容需要root權(quán)限才能看到。
上面展示的內(nèi)部存儲圖就是其中一部分子目錄。
2. 一級目錄
選其中幾個重要的文件夾介紹。
2.1? /data包:主要存儲手機(jī)應(yīng)用的相關(guān)數(shù)據(jù)。
???????????????????????????????????????????
?
如上圖的二級目錄中,/data/app文件夾下存放三方應(yīng)用的apk文件;/data/data文件夾下存放系統(tǒng)應(yīng)用和三方應(yīng)用的包私有數(shù)據(jù),每個應(yīng)用都有獨(dú)屬于自己的包。
選一個三方應(yīng)用包——com.X.main,來分析三級目錄——/data/data/com.X.main下都有什么數(shù)據(jù):
??????????????????????????????????????
由包名不難看出:cache包存放緩存數(shù)據(jù),databases包存放使用SQLite存儲的數(shù)據(jù),files包存放普通數(shù)據(jù)(log數(shù)據(jù),json型數(shù)據(jù)等),shared_prefs包存放使用SharedPreference存放的數(shù)據(jù)。這些包都是由系統(tǒng)創(chuàng)建的。
2.2? /mnt/sdcard/storage包:這三個包,與手機(jī)的部分內(nèi)置存儲卡數(shù)據(jù)和外置存儲卡數(shù)據(jù)有關(guān)。
上面的完整目錄結(jié)構(gòu)圖中有其子目錄信息展示。
以內(nèi)置存儲卡來說,通常用sdcard0表示:Android4.1上,首先掛載到目錄/storage/sdcard0上面,/sdcard和/mnt/sdcard都只是指向/storage/sdcard0的軟鏈接;Android4.2上,首先掛載到目錄/storage/emulated/0(0就表示內(nèi)置存儲)上面,為兼容之前版本,又掛載到/storage/emulated/legency上面,/storage/sdcard0、/sdcard和/mnt/sdcard都只是指向/storage/emulated/legency的軟鏈接。(掛載相當(dāng)于真正位置,軟鏈接相當(dāng)于指針)。
/mnt/sdcard是Android2.2及之上版本使用,/sdcard是Android2.1及之下版本使用。
在手機(jī)的文件管理中看到的內(nèi)置存儲卡文件,如上面文件管理頁面的圖,就是/storage/emulated /0包的子目錄,Android包的路徑就是:/storage/emulated/0/Android。
2.3? 其他
/dev包:Linux系統(tǒng)的常規(guī)文件夾。
/system包:系統(tǒng)配置的文件夾,比如Android系統(tǒng)框架(framework)、底層類庫(lib)、字體(font)等。
三 存儲相關(guān)操作
1. 涉及的存儲空間
在Android開發(fā)中,我們常打交道的存儲空間有三部分。
一是根目錄下路徑為? /data/data/包名/XX? 的文件。開發(fā)中SQLite數(shù)據(jù)、SharedPreference數(shù)據(jù)均保存在這里,雖說我們可以讀寫操作,但這部分空間由系統(tǒng)維護(hù)。
二是在外置存儲卡上做存儲。暫時不講。
三是在內(nèi)置存儲卡中做存儲。在/storage/emulated/0/Android/data包下或與/storage/emulated/0/Android包同級目錄上,建立App包存儲數(shù)據(jù),這部分空間均由開發(fā)者維護(hù)。區(qū)別在于/storage/emulated/0/Android/data包下的數(shù)據(jù)為私有目錄數(shù)據(jù),會隨App卸載被清除,與/storage/emulated/0/Android包同級的數(shù)據(jù)(如系統(tǒng)目錄DCIM包,DOWNLOWN包和bluetooth包,還有下圖中的baidu包)屬于公有目錄數(shù)據(jù),不會隨App卸載被清除,這就會造成數(shù)據(jù)的卸載殘留。
???????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ??????????
Google官方建議開發(fā)者將App的數(shù)據(jù)存儲在私有目錄即/storage/emulated/0/Android/data包下,這樣卸載App時數(shù)據(jù)會隨之被系統(tǒng)清除,不會造成數(shù)據(jù)殘留。
2. 操作
對存儲空間進(jìn)行操作,首先要獲取存儲空間的存儲路徑,對此Android提供了Environment類和Context類來獲取路徑。
就上面對存儲空間的劃分,第一部分空間對用戶不可見,是在具體包名下的,和特定的App有關(guān),所以對這些數(shù)據(jù)的訪問需調(diào)用Context類中的方法;第三部分空間對用戶可見,私有目錄數(shù)據(jù)仍與特定App有關(guān),需調(diào)用Context類中的方法,而公有目錄數(shù)據(jù)與App無關(guān),應(yīng)調(diào)用Environment類中的方法。
總結(jié)如下圖:
??????????????????????????????????? ? ? ??
?寫了個小程序?qū)?span style="font-size:18px;">Environment類和Context類相關(guān)方法測試,如下圖:(冒號前為方法名,冒號后為輸出結(jié)果)
??????????????????????????????????????? ? ? ????????
?
鑒于Android系統(tǒng)自身攜帶的方法中用了External做區(qū)分,所以常見的一種劃分的稱呼是:將不可見的內(nèi)置存儲卡數(shù)據(jù)統(tǒng)稱為內(nèi)部數(shù)據(jù),將可見的內(nèi)置存儲卡數(shù)據(jù)和外置存儲卡數(shù)據(jù)(即手機(jī)的文件系統(tǒng)中可看到的數(shù)據(jù))統(tǒng)稱為外部數(shù)據(jù)。
四 回答最初提出的問題
手機(jī)設(shè)置的應(yīng)用管理中,每個App下都有清除數(shù)據(jù)和清除緩存,清除的分別是哪里的數(shù)據(jù)?
還是用上面的Genymotion模擬器設(shè)備來分析,主要測試三部分?jǐn)?shù)據(jù):
內(nèi)部數(shù)據(jù):/data/data/包名/XXX
外部私有數(shù)據(jù):/storage/emulated/0/Android/data/包名/XXX
?
外部公有數(shù)據(jù):/storage/emulated/0/包名/XXX
測試結(jié)果圖就不上了,直接上結(jié)論:
清除緩存:將外部私有數(shù)據(jù)下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,將內(nèi)部數(shù)據(jù)下的cache包下的內(nèi)容(/data/data/包名/cache/XXX)清除 。
清楚數(shù)據(jù):將外部私有數(shù)據(jù)包(/storage/emulated/0/Android/data/包名)清除,將內(nèi)部數(shù)據(jù)下的所有內(nèi)容(/data/data/包名/XXX)清除;
而兩種操作對外部公有數(shù)據(jù)均無影響。
參考
http://www.androidchina.NET/4106.html
http://ipjmc.iteye.com/blog/1447097
http://www.ithao123.cn/content-6637641.html
轉(zhuǎn)載于:https://www.cnblogs.com/Free-Thinker/p/7388908.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的Android内存解析(二)— 详解内存,内部存储和外部存储的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 2222 AC自动机
- 下一篇: i.mx6 Android5.1.1 s