Android 内存 内部存储和外部存储(三)

总述

觉得十分有必要搞清楚内存,内部存储和外部存储的区别,还有我们在开发中真正将数据存在了手机的哪儿。

先提一个问题:手机设置的应用管理中,每个App下都有清除数据和清除缓存,清除的分别是哪里的数据?


一   内存,内部存储和外部存储

1. 可对Android手机存储空间做如下划分:

                                                 
整个存储空间分为内部存储和外部存储两部分,内部存储中又包含RAM和ROM等部分。

2. 具体概念区分

内部存储,即InternalStorage,也常说内置存储卡,这是手机内置的存储空间,出厂时就被确定,是手机的一个硬件指标。类比电脑的内存。

外部存储,即ExternalStorage,也常说外置存储卡,手机出厂时并不存在,是由用户自由扩展的存储空间,常见的就是SD卡。类比电脑的外接移动硬盘。
RAM,即常说的运行时内存,是手机运行时存储数据和指令的地方,注意是运行时内存。类比电脑的内存条。
ROM,用来存放一些系统文件,应用配置和其他数据的地方,是内部存储中主要存储区域。类比于Windows电脑的C盘。

3. 以小米的红米手机系列为例,打开设置中的关于手机一项,可以看到下图:

                                                             

上图中运行内存即RAM,共2G,机身存储即内部存储,共8G。

打开手机的文件管理,再点击手机一项,可以看到下图:
                                                                


上图中箭头所指的地方,可以进行内部存储与外部存储的切换,当前页为内部存储下的展示,这只是Android系统存储数据的一部分而已,大部分数据都对用户隐藏。至于红框部分下面继续讲。

二  详说存储

一般来说,App软件大都安装在内部存储的ROM区,当然现在也有办法安装在SD卡上,但这需要App自身支持及SD卡分区等一系列操作,下面讨论的App是安装在ROM区的。

1. 完整目录结构

以Genymotion模拟器设备为例来分析,型号是三星GalaxyS5。直接使用AndroidStudio的DDMS,打开File Explorer,我们可以看到下图:                                    

这张图是手机根目录下的完整目录结构图,内外部存储均包含在内。不过有些文件内容需要root权限才能看到。

上面展示的内部存储图就是其中一部分子目录。

2. 一级目录

选其中几个重要的文件夹介绍。

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时数据会随之被系统清除,不会造成数据残留。

2. 操作

对存储空间进行操作,首先要获取存储空间的存储路径,对此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)清除;

而两种操作对外部公有数据均无影响。


参考

http://www.androidchina.net/4106.html

http://ipjmc.iteye.com/blog/1447097

http://www.ithao123.cn/content-6637641.html


————————————————
版权声明:本文为CSDN博主「Summer舒舒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/SummerInnPhuket/article/details/50790365

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android内部路径和外部存储路径的区别在于其访问权限和存储位置。 Android内部路径是指应用程序在设备的内部存储空间中创建的路径。这个路径只能被应用程序本身访问,其他应用程序、用户或系统都无法直接访问。内部路径通常用于存储应用程序的私密数据,如缓存文件、数据库文件等。由于内部路径只能被应用程序访问,所以应用程序对其具有读写权限,并且可以在应用程序卸载时将内部路径下的数据一并删除。 而外部存储路径则是指设备上的可移动存储介质,如SD卡。这个路径是被所有应用程序以及使用设备的用户和系统共享的,因此外部存储路径的数据可以被多个应用程序共享和访问。外部存储路径通常用于存储大量的公共数据,如音频、视频、图片等。由于外部存储路径是共享的,所以应用程序对其只具有读写权限,并且应用程序卸载时不会删除外部存储路径下的数据。 需要注意的是,由于外部存储路径是被所有应用程序共享的,所以访问外部存储路径需要申请相关的权限,并且需要注意防止数据被其他应用程序非法访问或篡改。在使用外部存储路径时,还需要进行容量检测,以确保设备上有足够的可用存储空间。 综上所述,Android内部路径和外部存储路径在访问权限、存储位置和数据共享等方面存在区别。根据应用程序的需求和数据的性质,开发者可以选择合适的路径来存储和管理数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值