安卓內部外部文件存儲

總述

覺得十分有必要搞清楚內存,內部存儲和外部存儲的區別,還有我們在開發中真正將數據存在了手機的哪兒。

先提一個問題:手機設置的應用管理中,每個App下都有清除數據和清除緩存,清除的分別是哪裏的數據?

一 內存,內部存儲和外部存儲

  1. 可對Android手機存儲空間做如下劃分:

整個存儲空間分爲內部存儲和外部存儲兩部分,內部存儲中又包含RAM和ROM等部分。

  1. 具體概念區分

內部存儲,即InternalStorage,也常說內置存儲卡,這是手機內置的存儲空間,出廠時就被確定,是手機的一個硬件指標。類比電腦的內存。

外部存儲,即ExternalStorage,也常說外置存儲卡,手機出廠時並不存在,是由用戶自由擴展的存儲空間,常見的就是SD卡。類比電腦的外接移動硬盤。
RAM,即常說的運行時內存,是手機運行時存儲數據和指令的地方,注意是運行時內存。類比電腦的內存條。
ROM,用來存放一些系統文件,應用配置和其他數據的地方,是內部存儲中主要存儲區域。類比於Windows電腦的C盤。

  1. 以小米的紅米手機系列爲例,打開設置中的關於手機一項,可以看到下圖:


上圖中運行內存即RAM,共2G,機身存儲即內部存儲,共8G。
打開手機的文件管理,再點擊手機一項,可以看到下圖:



上圖中箭頭所指的地方,可以進行內部存儲與外部存儲的切換,當前頁爲內部存儲下的展示,這只是Android系統存儲數據的一部分而已,大部分數據都對用戶隱藏。至於紅框部分下面繼續講。

二 詳說存儲

一般來說,App軟件大都安裝在內部存儲的ROM區,當然現在也有辦法安裝在SD卡上,但這需要App自身支持及SD卡分區等一系列操作,下面討論的App是安裝在ROM區的。

  1. 完整目錄結構

以Genymotion模擬器設備爲例來分析,型號是三星GalaxyS5。直接使用AndroidStudio的DDMS,打開File Explorer,我們可以看到下圖:


這張圖是手機根目錄下的完整目錄結構圖,內外部存儲均包含在內。不過有些文件內容需要root權限才能看到。

上面展示的內部存儲圖就是其中一部分子目錄。

  1. 一級目錄

選其中幾個重要的文件夾介紹。

2.1 /data包:主要存儲手機應用的相關數據。



如上圖的二級目錄中,/data/app文件夾下存放三方應用的apk文件;/data/data文件夾下存放系統應用和三方應用的包私有數據,每個應用都有獨屬於自己的包。

選一個三方應用包——com.X.main,來分析三級目錄——/data/data/com.X.main下都有什麼數據:


由包名不難看出:cache包存放緩存數據,databases包存放使用SQLite存儲的數據,files包存放普通數據(log數據,json型數據等),shared_prefs包存放使用SharedPreference存放的數據。這些包都是由系統創建的。

2.2 /mnt/sdcard/storage包:這三個包,與手機的部分內置存儲卡數據和外置存儲卡數據有關。

上面的完整目錄結構圖中有其子目錄信息展示。

以內置存儲卡來說,通常用sdcard0表示:Android4.1上,首先掛載到目錄/storage/sdcard0上面,/sdcard和/mnt/sdcard都只是指向/storage/sdcard0的軟鏈接;Android4.2上,首先掛載到目錄/storage/emulated/0(0就表示內置存儲)上面,爲兼容之前版本,又掛載到/storage/emulated/legency上面,/storage/sdcard0、/sdcard和/mnt/sdcard都只是指向/storage/emulated/legency的軟鏈接。(掛載相當於真正位置,軟鏈接相當於指針)。

/mnt/sdcard是Android2.2及之上版本使用,/sdcard是Android2.1及之下版本使用。

在手機的文件管理中看到的內置存儲卡文件,如上面文件管理頁面的圖,就是/storage/emulated /0包的子目錄,Android包的路徑就是:/storage/emulated/0/Android。

2.3 其他
/dev包:Linux系統的常規文件夾。
/system包:系統配置的文件夾,比如Android系統框架(framework)、底層類庫(lib)、字體(font)等。

三 存儲相關操作

  1. 涉及的存儲空間

在Android開發中,我們常打交道的存儲空間有三部分。

一是根目錄下路徑爲 /data/data/包名/XX 的文件。開發中SQLite數據、SharedPreference數據均保存在這裏,雖說我們可以讀寫操作,但這部分空間由系統維護。

二是在外置存儲卡上做存儲。暫時不講。

三是在內置存儲卡中做存儲。在/storage/emulated/0/Android/data包下或與/storage/emulated/0/Android包同級目錄上,建立App包存儲數據,這部分空間均由開發者維護。區別在於/storage/emulated/0/Android/data包下的數據爲私有目錄數據,會隨App卸載被清除,與/storage/emulated/0/Android包同級的數據(如系統目錄DCIM包,DOWNLOWN包和bluetooth包,還有下圖中的baidu包)屬於公有目錄數據,不會隨App卸載被清除,這就會造成數據的卸載殘留。



Google官方建議開發者將App的數據存儲在私有目錄即/storage/emulated/0/Android/data包下,這樣卸載App時數據會隨之被系統清除,不會造成數據殘留。

  1. 操作

對存儲空間進行操作,首先要獲取存儲空間的存儲路徑,對此Android提供了Environment類和Context類來獲取路徑。

就上面對存儲空間的劃分,第一部分空間對用戶不可見,是在具體包名下的,和特定的App有關,所以對這些數據的訪問需調用Context類中的方法;第三部分空間對用戶可見,私有目錄數據仍與特定App有關,需調用Context類中的方法,而公有目錄數據與App無關,應調用Environment類中的方法。

總結如下圖:



寫了個小程序對Environment類和Context類相關方法測試,如下圖:(冒號前爲方法名,冒號後爲輸出結果)



鑑於Android系統自身攜帶的方法中用了External做區分,所以常見的一種劃分的稱呼是:將不可見的內置存儲卡數據統稱爲內部數據,將可見的內置存儲卡數據和外置存儲卡數據(即手機的文件系統中可看到的數據)統稱爲外部數據。

四 回答最初提出的問題

手機設置的應用管理中,每個App下都有清除數據和清除緩存,清除的分別是哪裏的數據?

還是用上面的Genymotion模擬器設備來分析,主要測試三部分數據:

內部數據:/data/data/包名/XXX

外部私有數據:/storage/emulated/0/Android/data/包名/XXX

外部公有數據:/storage/emulated/0/包名/XXX

測試結果圖就不上了,直接上結論:
清除緩存:將外部私有數據下的cache包(/storage/emulated/0/Android/data/包名/cache)清除,將內部數據下的cache包下的內容(/data/data/包名/cache/XXX)清除 。

清楚數據:將外部私有數據包(/storage/emulated/0/Android/data/包名)清除,將內部數據下的所有內容(/data/data/包名/XXX)清除;

而兩種操作對外部公有數據均無影響。

來源:
https://blog.csdn.net/summerinnphuket/article/details/50790365

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章