内存与外存:
- 早期的 Android 手机分为内存、外存,内存是手机自带的,外存是可以额外添加的。
- 现在的 Android 手机普遍都只有内存,没有外存。
运行内存和其他内存:
内存可以分为运行内存和其他内存,如 6G/64G 的手机指的就是 6G 的运行内存和 64G 的其他内存。
- 运行内存使用 RAM(Random Access Memory),读写速度更快。
- 其他内存使用 ROM(Read Only Memory),更便宜。
(原始的 ROM 只能读,后来出现了可读可写的 Flash Memory,但习惯上仍叫做 ROM)
私有内存和共有内存:
其他内存可分为私有内存和共有内存。
- 私有内存包括 data、cache、system 等目录。
- 共有内存指 storage 目录。
/sdcard、/storage/sdcard、/mnt/sdcard、/storage/sdcard0:
- /sdcard、/mnt/sdcard、/storage/sdcard0,都是一个软链接,指向:
/storage/emulated/0
- /storage/sdcard 不存在
/data/data 与 /data/user/0:
- 单用户时,/data/data 指用户数据文件夹
- 多用户时,/data/user/0 指用户 0 的数据文件夹
/data/data、/sdcard/Android/data、/sdcard:
/data/data/packagename
目录会在应用卸载后自动删除,只有本应用可读写,读写无需权限/sdcard/Android/data/packagename
目录会在应用卸载后自动删除,所有应用均可读写,本应用读写无需权限,其他应用读写需权限/sdcard
中的其他目录,不会在应用卸载后自动删除,所有应用均可读写,读写需权限
/data/data/packagename 目录的大小:
-
/data/data/packagename 的大小就是 /data 的大小,/data 目录大小没有限制。通过 adb shell df 查看 ,发现 data、sdcard 的总空间、可用空间都一致,即它们位于一个分区,共享同样的空间。
(似乎很早之前它们是不同的,见http://www.miui.com/thread-1355995-1-1.html) -
/Android/data
目录也位于 sdcard 的分区。// 小米 mix 2,android 9.0 // 华硕,android 5.0 chiron:/ $ df -h Filesystem Size Used Avail Use% Mounted on rootfs 2.6G 6.1M 2.6G 1% / tmpfs 2.7G 804K 2.7G 1% /dev tmpfs 2.7G 0 2.7G 0% /mnt /dev/block/dm-0 4.8G 3.1G 1.6G 65% /system none 2.7G 0 2.7G 0% /sys/fs/cgroup /dev/block/sda17 51G 17G 34G 34% /data /dev/block/sde37 12M 10M 1.4M 88% /system/vendor/dsp /dev/block/sde42 806M 429M 361M 55% /cust /dev/block/sda16 232M 4.2M 220M 2% /cache /dev/block/sda10 4.9M 160K 4.8M 4% /dev/logfs /data/media 51G 17G 34G 34% /storage/emulated
常用存储路径的获取方法:
Environment.getDataDirectory().absolutePath = /data
Environment.getRootDirectory().absolutePath = /system
Environment.getDownloadCacheDirectory().absolutePath = /cache
Environment.getExternalStorageDirectory().absolutePath = /storage/emulated/0
context.getDataDir() = /data/user/0/packagename
context.getCacheDir() = /data/user/0/packagename/cache
context.getFilesDir() = /data/user/0/packagename/files
context.getFileStreamPath("aa") = /data/user/0/packagename/files/aa
context.getDir("aa", Context.MODE_PRIVATE) = /data/user/0/packagename/app_aa
context.getExternalCacheDir() = /storage/emulated/0/Android/data/packagename/cache
context.getExternalFilesDir(null) = /storage/emulated/0/Android/data/packagename/files
目录测试:
小米 mix 2,android 9.0(如下图)
小米 4,android 6.0(如下图)
荣耀 5A,android 6.0(比下图多了一个存在的,/storage/sdcard0 也是一个软链接,指向 /storage/emulated/0)
图一:特定路径是否存在
图二:方法调用获取的路径