最近公司要整android内部培训,分配给我写个培训文档,这里记录如下:
撰写不易,转载请注明出处:http://blog.csdn.net/jscese/article/details/40897703
导读:
这里补充下android运行时的文件系统结构,
同样,资料网上有很多,只是简单介绍我常涉及到的,个人观点,仅供参考~
各个厂商平台可能会有出入.这里单以我这边mstar的平台
以“/”代表文件系统的根目录.
——jscese
2014/11/7
文件系统生成
目前android编译出来的镜像基本都是ext4格式,可用file命令查看,不再是之前的yaffs2,因为之前用的是nand,现在的主流已是emmc,但是在制作android文件系统时挂载的类型就五花八门了,各种都有.
可在系统启动时/system/core/init/init.c中的main中查看mount类型.
对文件系统的创建语句基本都写在/system/core/rootdir/init.rc,这个文件语法可参考/system/core/init/readme.txt,交由init.c负责解析执行.其中init.rc还会加载平台rc执行一些自己的操作:import/init.${ro.hardware}.rc一般的.rc都放在“/”目录下.
关于init.rc中的语句怎么被执行,这里不多描述,可另行参考init机制,可以看到里面很多对分区以及文件的shell命令,比如mount,mkdir,symlink,chmod...
mount上去的文件类型大体有这几种:
tmpfs devpts proc sysfsrootfs yaffs2 cgroup ext4 debugfs
这些文件系统类型可去维基百科查,每一种都有自己的特性.可在shell终端输入mount查看挂载情况.
我们通过shell终端看到的文件系统目录是最终制作完成的产物,有的文件目录下是挂载的分区,如果修改就是实际修改的nand/emmc上面的内容,有的可能只是制作过程中从分区某个地方copy放在那个目录下的,你删除了,下次重启依旧还会存在,这个就要根据具体情况而判断了.
这个的生成过程还是很繁杂的,这里就不一一述说.下面介绍下常用到的目录文件.
详细可参考:Android——启动过程详解
/cache
缓冲区目录,用于存放临时文件,目前我这边用到的地方就是存放从网络下载OTA包用于更新.
/data
顾名思义,主要用于存放数据的地方,往下的目录都是存放app的相关分类数据.
其中/data/app目录下存放的就是用户安装的apk文件.
/data/data目录下存放的是系统中所有app的数据文件,以apk包名区分,其中会有提交的数据库以及xml数据文件.
/dev
linux设备文件夹,存放设备节点文件,挂载的是tmpfs格式文件系统,断电后数据将会消失.android系统上的设备都会在这个目录底下创建设备文件,
秉承linux的理念:一切设备皆文件.并且都是可以通过文件对设备进行操控管理.
其中/dev/block下列出所有emmc存储设备的所有block
/etc
软连接指向/system/etc,这个目录一般用于存放系统中的各种配置文件,没什么好说的.
/mnt
外部挂载点目录,作为外部存储设备的挂载点路径,往下的分支常用的包括/mnt/sdcard为android默认SD卡挂载点.其它的不同平台可能会有大的差异,比如挂载usb设备的挂载点,我这边挂载在/mnt/usb
/proc
一个虚拟的文件系统,由kernel提供,不是实际的存储空间,存在kenel管理的内存中,应用层可通过/proc下的文件动态获取kernel中系统进程(process)的运行信息.也可通过/proc/sys目录下可写文件修改kernel运行状态,实现与kernel的交互.
在init.c中挂载到/proc文件上.
其中比较常用的获取文件:/proc/cpuinfo/proc/meminfo /proc/mounts /proc/version ...
顾名思义.可以在shell使用cat*查看
设置/proc/sys/kernel状态值,init.rc中就有设置,可以参考,大部分设置在/proc/sys/kernel下
shell下可使用echo* > * 重定向设置状态值.
/sbin
存放root用户可执行文件的目录,一般存在这下面的就是adbd
/sdcard
软连接上面说到的/mnt/sdcard,SD卡的挂载点
/sys
类似/proc,也是虚拟的文件系统.
区别在于这个文件系统提供的是关乎kernel中的设备驱动.
/sys/devices下就是已经注册到总线上的所有物理设备.
/sys/dev下面是blockchar设备的节点文件,链接到真实设备.
/sys/module这里可以看已经insmod的kerneldevice driver
同/proc下一样可使用cat查看
/sys/kernel下的是可写的设备值,同/proc一样操作写入控制.
/system
这个是android系统最重要的文件目录了,可以在rc中看到挂载的是system分区,也就是源码编译出来的system.img镜像,主要的运行机制也就全在这个目录下了,默认是挂载成ext4只读.
/system/app系统预置的apk存放路径,只有root才有写权限
/sysem/bin这个下面全部是android系统可执行文件
/system/build.prop编译过程中收集的各种属性
/system/etc上面有提到,配置文件
/system/fonts字库
/system/framework下面全是jar包也就是源码中frameworks编译出来的系统框架,核心所在
/system/lib存放几乎所有编译出来的动态库(.so)
/system/vendor存放一些厂商的东西一般有applib之类的
这几个应该算是最重要的,其它的目录不一一列出.
如果想要修改/system下面的内容,可在shell终端输入:mount-o remount rw /system
重挂载为可读写.
/tmp
临时文件