1. 关于内部存储和外部存储
2015年10月13日
15:52
1. 内部存储(internal storage)和外部存储(external storage)的概念区分和实际位置
开发层次:
1. 所有的安卓设备都有内部存储和外部存储
2. 内部存储一般指/data中除了外部存储之外的地方,但是app能访问的只有在/data/data/packageName文件夹
3. 外部存储(external storage)可同时有主存储(primary)和次存储(secondary)
a. primary默认为ROM虚拟emulated的一部分空间,(若有可以插sd卡)secondary默认为sd卡
b. 部分手机可以设置primary为sd卡,此时secondary为ROM虚拟的一部分空间
c. KITKAT对secondary的存储权限做了修改,不允许开发者直接修改里面的内容
4. 内部存储和外部存储在ROM的方式
a. 采用虚拟emulated的技术动态分配占用,实际上还是一块分区(都在/data分区)(基于fuse的vfs,现在的android机子大部分是这么做的)
b. 采用物理上分区(以前的android就是分区的,所以经常还有很多空间软件安装不进去去内部存储,因此有app2sd技术)
5. 默认(primary)外部存储(external storage)设置为sd卡时
a. 实质修改挂载位置(一定是fuse的vfs,部分手机现在有设置默认存储空间的功能)——能使得ROM全部作为内部存储(做对于现在大部分app只能装在sd卡非常有 用),因为开发者通过api获取的一般是默认外部存储
6. API的方法名外部村粗对比内部存储多了external(因此该api对于是否有外置sd卡的手机都是可用的,但却不一定获取的是sd卡)
用户层次:
内部存储——机身ROM自带存储空间,是像16g 32g 64g版本的手机所带的存储空间
外部存储——外置sd卡存储空间(比较少叫做外部存储,这里是相对内部存储的概念)
默认数据存储位置(部分手机可设置)——默认外部存储为sd卡还是ROM的一部分
Eg:
这是nexsus 4虚拟机里设置中看到的存储,在用户层次上都是内部存储(在开发层次上既有内部存储也有外部存储)
从开发角度看,根目录下除了文件管理器看到的内容外都为内部存储
外部存储空间虚拟出来的位置
可以看到蓝色部分才是和文件管理器看到的是一样的
红色部分可以看到软连接(由于以前很多人写程序都是直接用绝对路径的)
所以绝对路径/mnt/sdcard /sdcard /storage/sdcard0 指的位置都是外部存储所在外置
关于android的fuse的说法可看http://blog.youkuaiyun.com/fybon/article/details/21159123
2. 内存(RAM)、内部存储(Internal Storage)和外部存储(External Storage)、机身内存==内置sd卡(ROM)、外置sd卡之间的关系
1. 内存是运行内存,一般1G 2G 3G RAM(内部存储和内存没有关系)
2. 内部存储是一块特殊的存储空间,一般在16g 32g内置sd卡中的一部分空间
3. 外部存储空间就是sd卡除了内部存储之外的空间(可以是外置sd卡、也可以是内置sd卡(ROM),现在的android系统都有个设置默认存储空间的设置选项就是设置这个的(有些系统会在这里混淆内部存储(这里是内置sd卡)、sd卡的概念))
4. d. 内置sd卡(16g 32g版本手机, 这个ROM说的就是内置sd卡),
5. e. 外置sd卡现在手机还能接sd卡扩充的空间
3. 内部存储(internal storage)和外部存储(external storage)的逻辑意义
再次强调:
所有的安卓设备都有外部存储和内部存储,这两个名称来源于安卓的早期设备,那个时候的设备内部存储确实是固定的,而外部存储确实是可以像U盘一样移动的。但是在后来的设备中,很多中高端机器都将自己的机身存储扩展到了8G以上,他们将存储在概念上分成了"内部internal" 和"外部external" 两部分,但其实都在手机内部。所以不管安卓手机是否有可移动的sdcard,他们总是有外部存储和内部存储。
内部存储(一般指/data区):
存储数据库、sharedPreference等不希望被公开的文件
1. 注意内部存储不是内存。内部存储位于系统中很特殊的一个位置,
2. 如果你想将文件存储于内部存储中,那么文件默认只能被你的应用访问到,且一个应用所创建的所有文件都在和应用包名相同的目录下。也就是说应用创建于内部存储的文件,与这个应用是关联起来的。
3. 当一个应用卸载之后,内部存储中的这些文件也被删除。
4. 从技术上来讲如果你在创建内部存储文件的时候将文件属性设置成可读,其他app能够访问自己应用的数据,前提是他知道你这个应用的包名,如果一个文件的属性是私有(private),那么即使知道包名其他应用也无法访问。
5. 内部存储空间十分有限(对于/data区以前是分区来说),因而显得可贵,另外,它也是系统本身和系统应用程序主要的数据存储所在地,一旦内部存储空间耗尽,手机也就无法使用了。所以对于内部存储空间,我们要尽量避免使用。SharedPreferences和SQLite数据库都是存储在内部存储空间上的,因为有些数据必须存储在内部存储上
外部存储:
存储一些被别人访问也没关系的文件,例如缓存的头像、压缩的视音频文件,如果这部分文件不需要被媒体检测、删除后也不需要保留,则应该放在packageName下,否则放在movies music dcim 等文件夹中
1. 外部存储上和app包名绑定的文件夹在删除时也会被删除(Android/data/packageName )
2. 手机连接电脑,能被电脑识别的部分就一定是外部存储。
3. 外部存储是不安全的,可能被其他应用直接读取
以上部分内容摘自,感谢该博主的说明,让我更好的理解了这个http://blog.youkuaiyun.com/androidwifi/article/details/17725989
以上是我作为android开发者和使用者的理解和领悟