天天看點

Android 存儲空間和存儲路徑總結

关于Android内部的存储空间,记忆很暧昧,每次都是现用现查。

今天又遇到了,借此机会系统的总结一下。

 

  路径取得方法

APP

专用

非root

用户可见

删除方法

APP

卸载时

内部数据空间 Context.getFilesDir() yes no 主动删除 消失
内部缓存空间 Context.getCacheDir() yes no 清空缓存 消失
外部数据空间 Context.getExternalFilesDir() yes yes 主动删除 消失
外部缓存空间 Context.getExternalCacheDir() yes yes 清空缓存 消失

外部公開空间

(通常是/sdcard)

Environment.getExternalStorageDirectory() no yes 无法删除 不消失
外部公開共享空间 Environment.getExternalStoragePublicDirectory() no yes 无法删除 不消失

缓存空间没有大小限制。

内部空间只有APP自己可以访问,其他APP和手机用户都不可以见。卸载消失。

外部空间 APP自己,手机用户,其他授权APP可以访问。卸载消失

公開空间,所有APP都可以访问。卸载不消失。

 

 

以下作为补充阅读,看了会晕。

External 的字眼非常容易让人误会。根据字面联想,容易让人是手机外置空间(SD卡,外置硬盘之类)。

其实是指系统storage以外的storage的意思。

用getExternalXXXX()方法取得的空间有可能是 SD卡空间,也有可能还是手机内置存储空间。APP这边是无法控制的。

getExternalStorageDirectory取到的一般是/sdcard空间,但是不是绝对的,编程的时候需要注意。

如下面所示,根据手机不同,实际取到的路径也是不一样的。所以不要用绝对路径,要通过Context或者Enviroment来取。

206SH(Android4.2.2)

# 各种路径
Context.getFilesDir()                           :/data/data/com.example/files
Context.getCacheDir()                           :/data/data/com.example/cache
Context.getExternalCacheDir()                   :/storage/sdcard0/Android/data/com.example/cache
Context.getExternalFilesDir()                   :/storage/sdcard0/Android/data/com.example/files
Environment.getExternalStorageDirectory()       :/storage/sdcard0
Environment.getExternalStoragePublicDirectory() :/storage/sdcard0/DCIM
Environment.isExternalStorageEmulated()         :false
Environment.isExternalStorageRemovable()        :false

# 看看 getFilesDir() mount到哪里
/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,nosuid,nodev,noatime,discard,noauto_da_alloc,data=ordered 0 0
# 看看 getExternalStorageDirectory() 实际mount到哪里
/dev/fuse /storage/sdcard0 fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0
# 看看实际的SD卡mount到哪里
/dev/block/vold/179:33 /storage/sdcard0/external_sd vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0602,dmask=0602,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
           

Nexus7(Android4.4.2)

# 各种路径
Context.getFilesDir()                           :/data/data/com.example/files
Context.getCacheDir()                           :/data/data/com.example/cache
Context.getExternalCacheDir()                   :/storage/emulated/0/Android/data/com.example/cache
Context.getExternalFilesDir()                   :/storage/emulated/0/Android/data/com.example/files
Environment.getExternalStorageDirectory()       :/storage/emulated/0
Environment.getExternalStoragePublicDirectory() :/storage/emulated/0/DCIM
Environment.isExternalStorageEmulated()         :true
Environment.isExternalStorageRemovable()        :false

# 看看 getFilesDir() 实际mount到哪里
/dev/block/platform/msm_sdcc.1/by-name/userdata /data ext4 rw,seclabel,nosuid,nodev,noatime,nomblk_io_submit,errors=panic,data=ordered 0 0
# 看看 getExternalStorageDirectory() 实际mount到哪里
/dev/fuse /mnt/shell/emulated fuse rw,nosuid,nodev,relatime,user_id=1023,group_id=1023,default_permissions,allow_other 0 0

# /storage/emulated 是symlink,看看它的实际指向
[email protected]:/ $ ls -la /storage/emulated/
lrwxrwxrwx root     root              2014-01-30 19:47 legacy -> /mnt/shell/emulated/0
           

 

实验数据

Environment.getExternalStorageDirectory().toString();

/storage/emulated/0

但是实际指向的是 /sdcard/

adb pull /sdcard/test.jpg             即可把/storage/emulated/0下的数据拿出来

adb pull /storage/emulated/0/test.jpg 也能取出来

adb pull /mnt/sdcard/test4.jpg

各种API所取得的路径:

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)

      /storage/emulated/0/Pictures/

     /storage/emulated/0/Pictures/20200307

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);

    /storage/emulated/0/DCIM

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);

    /storage/emulated/0/Documents

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);

    /storage/emulated/0/Download

Environment.getExternalStorageDirectory()得到的结果

 result = {[email protected]} "/storage/emulated/0"

      0 = {[email protected]} "/storage/emulated/0/Android"

      1 = {[email protected]} "/storage/emulated/0/Music"

      2 = {[email protected]} "/storage/emulated/0/Podcasts"

      3 = {[email protected]} "/storage/emulated/0/Ringtones"

      4 = {[email protected]} "/storage/emulated/0/Alarms"

      5 = {[email protected]} "/storage/emulated/0/Notifications"

      6 = {[email protected]} "/storage/emulated/0/Pictures"

      7 = {[email protected]} "/storage/emulated/0/Movies"

      8 = {[email protected]} "/storage/emulated/0/Download"

      9 = {[email protected]} "/storage/emulated/0/DCIM"

     10 = {[email protected]} "/storage/emulated/0/postasbuttonlogo.png"

     11 = {[email protected]} "/storage/emulated/0/logo_mark.png"

     12 = {[email protected]} "/storage/emulated/0/logo_mark_white.png"

     13 = {[email protected]} "/storage/emulated/0/logo_x_s.png"

     14 = {[email protected]} "/storage/emulated/0/test.jpg"

     15 = {[email protected]} "/storage/emulated/0/test2.jpg"

     16 = {[email protected]} "/storage/emulated/0/test3.jpg"

     17 = {[email protected]} "/storage/emulated/0/test4.jpg"

     18 = {[email protected]} "/storage/emulated/0/test5.jpg"

Environment.getRootDirectory()得到的结果

   result = {[email protected]} "/system"

        0 = {[email protected]} "/system/lost+found"

        1 = {[email protected]} "/system/app"

        2 = {[email protected]} "/system/bin"

        3 = {[email protected]} "/system/build.prop"

        4 = {[email protected]} "/system/compatibility_matrix.xml"

        5 = {[email protected]} "/system/etc"

        6 = {[email protected]} "/system/fake-libs"

        7 = {[email protected]} "/system/fonts"

        8 = {[email protected]} "/system/framework"

        9 = {[email protected]} "/system/lib"

       10 = {[email protected]} "/system/manifest.xml"

       11 = {[email protected]} "/system/media"

       12 = {[email protected]} "/system/priv-app"

       13 = {[email protected]} "/system/tts"

       14 = {[email protected]} "/system/usr"

       15 = {[email protected]} "/system/vendor"

       16 = {[email protected]} "/system/xbin"

Environment.getDataDirectory()

    /data

Environment.getDownloadCacheDirectory()

    /data/cache

context.cacheDir

result = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/cache"

 0 = {File@9209} "/data/user/0/jp.co.persol.postas.aposfood/cache/WebView"

 1 = {Fil[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/cache/volley"

 2 = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/cache/internalCache.txt"

context.externalCacheDir

        /storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/cache

context.externalCacheDirs

        /storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/cache

         0 = {[email protected]} "/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/cache"

         0 = {[email protected]} "/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/cache/test4.jpg"

两个互相看不到对方

context.externalMediaDirs

/storage/emulated/0/Android/media/jp.co.persol.postas.aposfood

context.fileList()

result = {String[4]@8894} 

 0 = "logs"

 1 = "download"

 2 = "work"

 3 = ".realm.temp"

context.filesDir

result = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/files"

 0 = {F[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/files/logs"

 1 = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/files/download"

 2 = {F[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/files/work"

 3 = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/files/.realm.temp"

context.dataDir

result = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood"

 0 = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/cache"

 1 = {F[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/code_cache"

 2 = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/lib"

 3 = {[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/files"

 4 = {Fi[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/app_webview"

 5 = {Fil[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/app_textures"

 6 = {Fil[email protected]} "/data/user/0/jp.co.persol.postas.aposfood/shared_prefs"

context.getExternalFilesDir(Environment.DIRECTORY_DCIM)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/DCIM

context.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/Documents

context.getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/Download

context.getExternalFilesDir(Environment.DIRECTORY_PICTURES)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/Pictures

context.getExternalFilesDir(Environment.DIRECTORY_NOTIFICATIONS)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/Notifications

context.getExternalFilesDir(Environment.MEDIA_MOUNTED)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/mounted

context.getExternalFilesDir(Environment.MEDIA_UNMOUNTED)

/storage/emulated/0/Android/data/jp.co.persol.postas.aposfood/files/unmounted