9.1 Android的文件系统
讨论Android的文件系统,需要先从Android设备的存储硬件入手。如图9-1所示,Android的存储设备通常由只读存储器(ROM, Read-Only Memory)和扩展存储器(Memory Card)共同构成。
其中,只读存储器是设备自带的,属于设备不可分割的一部分,它的主要职责是用来存储整个Android系统的核心程序、数据及第三方应用,作用与PC的硬盘类似。虽然按习惯称为只读存储器,但实际上,它是由一块闪存(Flash Memory)构成的,不仅可以读取,也可以擦写。
扩展存储设备则是通过设备提供的插槽与设备进行连接的附加的外设,可以动态地进行插拔,Android中最常见的扩展存储器便是SD卡。从Android文件系统的特征来看,扩展存储器是Android应用放置共享数据的最重要场所(包括音频、视频、图像,等等),是保证很多应用正常工作的前提。因此,在实际应用中,扩展存储器也是Android不可缺少的存储设备。
小贴士 随着闪存的价格越来越低廉,在很多Android设备上,扩展存储器不再是通过外部插槽连接SD卡等来提供,而是直接和只读存储器共享同一块闪存存储。此时,所谓的扩展存储器就仅仅是起到了其共享存储空间、分享数据的作用,而与具体的硬件实现方式再无关系。
甚至,很多设备在提供了共享闪存的扩展存储器的同时,还提供了可扩容的插槽,用来添加其他的扩展存储器,使一台设备上可同时具有多个扩展存储器。早期的Android版本并没有针对多个扩展存储器做相关设计,导致各个设备厂商各行其道,纷纷用独门的解决方案来处理多扩展存储器,使得在开发中完整地掌控多个扩展存储器变得十分困难。
从Android 2.3开始提供android.os.storage.StorageManager服务来获取存储相关的信息。StorageManager中有很多隐藏API,可以获取到多扩展存储器的信息。比如,使用隐藏的StorageManager.getVolumeList函数,可以获取到设备上所有的扩展存储器信息。
在存储设备之上,运行的是Android文件系统。Android文件系统,实质上就是Linux的文件系统,具有很强的移植能力,通过挂载不同的第三方文件系统,使其可以运行在不同的设备和系统之上。通常而言,在只读存储器中运行的是yaffs2[1]文件系统,它挂载在Android文件系统之中,扩展存储卡则常为FAT32,对应着/sdcard/目录。
与一般的Linux文件系统相比,Android的文件系统只定义了“有Android特色”的目录结构,并为这些目录赋予了独特的属性和使命。
图 9-1 Android存储设备和文件结构
9.1.1 Android的目录结构
了解Android的目录结构,最好的方式就是自己动手,使用SDK提供的adb工具浏览Android的目录结构。通过如下命令,可以查看根目录下的文件和目录:
$adb shell ls-l
其中,adb shell指令是将adb切换进入shell模式,在该模式下,可以使用Android支持的shell指令,执行相关操作。
Android的根目录下定义了Android文件目录的基本框架(如表9-1所示),其中,保证Android正常运行的核心模块都存放在system目录中,包括底层的类库和应用。
而与开发者密切相关的目录是sdcard和data目录。sdcard是与扩展存储器对应的文件目录[2],存放需要共享给其他应用的数据。而data目录,则是用来保存应用安装包和应用运行时产生的数据。
[1]关于yaffs文件系统的详细介绍,可参见其官方网站:http://www.yaffs.net/。
[2]在很多手机中,不再需要外置的扩展存储器,而是将扩展存储器内置成为手机ROM的一部分。但是不论扩展存储器是否内置,是否以SD卡作为载体,在Android系统中,通常都会使用sdcard这个目录来存储对应的内容。