9.1.2 Android的应用数据存储

在Android中,第三方应用及其数据,都存放在data目录下。其中,应用安装包会被存放到/data/app/目录下,每个安装包的文件名都形如:应用包名.apk,以避免重复。

在Android中,应用的安装,就是将应用的安装包原封不动地拷贝到data/app/目录下(当然,此过程需要进行权限校验和用户确认)。每个Android的应用安装包本质上就是一个zip格式的压缩文件,通过这种方式安装,可以最大程度地节约宝贵的只读存储空间。

但节约存储空间带来的代价就是,应用每次运行时都需要将存储在安装包中的资源文件、数据文件动态地进行解压,使得应用启动的时间变长。为了提升应用的启动效率,Android会将解压出来的应用代码文件(格式是dex)解析提取后,缓存在dalvik-cache目录下。相比应用中包含的数据文件信息,代码文件的体积通常不会太大,不会占用太多的存储空间。通过这样的策略可以在节约存储空间的基础上有效地提升执行效率。

除了应用安装包,在data目录内,还会用来保存应用在运行中产生的数据,主要包括:应用的设置文件、数据库文件、备份文件,等等。Android的每个应用,都会在/data/data/目录下创建一个与安装包同名的应用数据目录,用来存放运行数据。

在应用数据目录中,每类数据都有其专属的子目录,比如,数据库文件存放在子目录databases下,而应用设置文件存放在子目录shared_prefs中。

比如,包名为com.test.sample的应用,其应用数据的目录为/data/data/com.test.sample/。对应的数据库文件存储在/data/data/com.test.sample/databases/目录下,设置文件存储在/data/data/com.test.sample/shared_prefs/,自定义的应用数据文件存储在目录/data/data/com.test.sample/files/下,等等。

不仅如此,Android还会为每个应用创建一个Linux帐号,只有通过本应用的帐号才有权限去运行该应用的安装包文件,读写应用数据目录内的文件(当然,有root权限的也可以进行相关操作)[1]。通过这样的权限保护策略,Android将每个应用的数据私有化,只有本应用的代码,才有权限去访问应用相关的数据,从而保证了该应用数据不会被其他应用获取或破坏。

小贴士 从Android 2.2开始,通过配置,可以将应用安装到扩展的外部存储设备中(比如,SD卡),示例如下:


<manifest android:installLocation="preferExternal"…>


使用这样的配置后,该应用会将安装包放到外部存储设备的特定目录中,但它在运行时产生的数据,依然会放在data/data目录下。这样,一方面可以有效地节省宝贵的只读存储器空间,另一方面也可以有效地保证应用运行数据的安全性。

[1]从本质上来看,/data/data/目录相当于Linux的home目录,应用目录则对应着home目录中某个帐号的目录。