Android 安裝包存儲路徑分析

Android 文件系統

在 Android Studio 可以在 DDMS 的 File Exploer 窗口中查看文件系統,下圖就是一個 Android 文件系統目錄。

 

Android 文件系統

Android 存儲分類 (/data 目錄和 /sdcard 目錄)

Android 的存儲可以分爲三類:內存、內置 SD 卡,外置 SD 卡

一、內存

對應的就是 /data 目錄,需要系統 root 之後才能查看,該目錄下有很多子目錄,其中對於軟件開發比較重要的是:

1、 /data/app

該文件夾存放着系統中安裝的第三方應用的 apk 文件,當我們調試一個app的時候,可以看到控制檯輸出的內容,有一項是
uploading …..就是上傳我們的apk到這個文件夾,上傳成功之後纔開始安裝。

 

Android 中應用的安裝就是將應用的安裝包原封不動地拷貝到 /data/app 目錄下,每個應用安裝包本質上就是一個 zip 格式的壓縮文件。爲了提升應用的啓動效率,Android 會將解壓出來的 dex 格式的應用代碼文件解析提取後,緩存在 /data/dalvik-cache 目錄下。

2、/data/data

該文件夾存放存儲包私有數據,對於設備中每一個安裝的 App,系統都會在內部存儲空間的 data/data 目錄下以應用包名爲名字自動創建與之對應的文件夾。
用戶卸載 App 時,系統自動刪除 data/data 目錄下對應包名的文件夾及其內容。
該目錄下又把存儲內容進行了分類:

  • data/data/包名/cache: 存放的 APP 的緩存信息
  • data/data/包名/databases: 存放 APP 的數據庫信息
  • data/data/包名/files: 存放 APP 的文件信息
  • data/data/包名/shared_prefs: 存放 APP 內的 SharedPreferences

3、API

  1. /data
Environment.getDataDirectory();
  1. /data/data/包名/files
context.getFilesDir();

對於 Files 目錄下的文件,通常不會通過 File 類的方式直接進行讀寫,而是利用一些封裝過的類或函數進行操作:

public FileInputStream openFileInput(String name)
public FileOutputStream openFileOutput(String name, int mode)

還可以直接刪除或查詢該目錄下的文件:

context.deleteFile(name)
context.fileList()
  1. /data/data/包名/cache
context.getCacheDir();
  1. /data/data/包名/shared_prefs
context.getSharedPreferences(name,mode)//返回的是 SharedPreferences 對象
context.deleteSharedPreferences(name)
  1. /data/data/包名/databases
context.getDataDir()
context.getDatabasePath(name)
context.deleteDatabase(name)
  1. /data/data/包名/app_name
context.getDir(name,mode)

經測試該方法會在 /data/data/包名/ 目錄下生成一個以 app_ 開頭的目錄

二、外部存儲

每個兼容 Android 的設備都支持可用於保存文件的共享“外部存儲”。 該存儲可能是可移除的存儲介質(例如 SD 卡)或內部(不可移除)存儲。 保存到外部存儲的文件是全局可讀取文件,而且,在計算機上啓用 USB 大容量存儲以傳輸文件後,可由用戶修改這些文件。

 

 

外部存儲在 Android 文件系統中是 sdcard 目錄,這裏只是一個快捷方式,真正的目錄是 /storage/emulated/legacy 文件夾

1、獲取外存路徑和狀態

要讀取或寫入外部存儲上的文件,應用必須獲取READ_EXTERNAL_STORAGE 或 WRITE_EXTERNAL_STORAGE系統權限。

  1. 獲取狀態
Environment.getExternalStorageState()

返回值是以下一種:

  • MEDIA_UNKNOWN
  • MEDIA_REMOVED
  • MEDIA_UNMOUNTED
  • MEDIA_CHECKING
  • MEDIA_NOFS
  • MEDIA_MOUNTED
  • MEDIA_MOUNTED_READ_ONLY
  • MEDIA_SHARED
  • MEDIA_BAD_REMOVAL
  • MEDIA_UNMOUNTABLE
  1. 獲取目錄
Environment.getExternalStorageDirectory()

返回的路徑是 /storage/emulated/0

2、公共目錄

Android 在外部存儲上提供了十個公共目錄來存儲相對應的文件:
通過 API Environment.getExternalStoragePublicDirectory(type) 來訪問

  • DIRECTORY_MUSIC:/storage/emulated/0/Music
  • DIRECTORY_PODCASTS:/storage/emulated/0/Podcasts
  • DIRECTORY_RINGTONES:/storage/emulated/0/Ringtones
  • DIRECTORY_ALARMS:/storage/emulated/0/Alarms
  • DIRECTORY_NOTIFICATIONS:/storage/emulated/0/Notifications
  • DIRECTORY_PICTURES:/storage/emulated/0/Pictures
  • DIRECTORY_MOVIES:/storage/emulated/0/Movies
  • DIRECTORY_DOWNLOADS:/storage/emulated/0/Downloads
  • DIRECTORY_DCIM:/storage/emulated/0/Dcim
  • DIRECTORY_DOCUMENTS:/storage/emulated/0/Documents

3、私有目錄

Android2.2 引入了基於擴展存儲器的應用緩存目錄,該目錄指向大容量的擴展存儲器。與應用的內存私有目錄一樣,緩存目錄會隨着應用的卸載一併刪除。
和內部存儲一樣,會在 SD 卡的 Android/data 目錄下生成對應包名的文件夾

  1. /storage/emulated/0/Android/data/應用包名/files
context.getExternalFilesDir(type)
  1. /storage/emulated/0/Android/data/應用包名/cache
context.getExternalCacheDir()
  1. 在 Android 目錄下除了 data 目錄還有一個 obb 目錄
    /storage/emulated/0/Android/obb/應用包名
context.getObbDir()

Android 文件系統一些其它目錄

  1. /cache 目錄
    通過 API Environment.getDownloadCacheDirectory() 訪問,存儲下載文件的緩存路徑
  2. /system 目錄
    通過 API Environment.getRootDirectory() 訪問,該目錄下也有一個 app 目錄,存放的是系統應用的 apk 文件。

/system/app 和 /data/app 的區別

  • /data/app 裏軟件權限沒全開,/system/app 裏的軟件獲取了所有權限
  • /data/app 可以應用卸載,/system/app 只能 root 後刪除
  • /data/app 文件夾大小隨便,/system/app 文件夾有大小限制
  • 卸載/system/app 目錄下的文件並不會增加系統空間,即可用 ROM 空間
  1. /mnt 目錄
    這個目錄專門用來當作掛載點掛在外部設備的,如 SD 卡,sdcard
    將會被系統視作一個文件夾,這個文件夾將會被系統嵌入到收集系統的 mnt 目錄中,所以在 /mnt 目錄下也會看到一個 sdcard 的快捷方式:

     

 

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