1.4 Android系统源代码目录与系统目录
Android源代码的目录中包含了Android系统所有的源代码,从底层驱动到上层应用,Android系统对所有文件都进行了详细管理。而在手机中,Android系统的目录与源代码的目录并不是一一对应的,而是与源代码编译之后,与打包生成的Image文件的结构相同。了解这些目录的结构,对于认识整个Android系统有很好的帮助。
1.4.1 Android系统源代码目录
前面我们已经把Android“大卸八块”了,下面我们就来给Android登记入库,不过这可不是一件容易的事情,要想看完整个Android的源代码,你要懂C、懂脚本、懂Java,不仅软硬兼通,而且有一颗耐得住寂寞、忍得了枯燥的心。所以,对于大多数人来说,我们只需要了解它的框架结构,出了问题知道从哪里着手解决就可以了。这就好比图书管理员,他不一定要把所有的书都读一遍,但是只要有用到,他就可以很快地找到相应的资料。
这里笔者给读者朋友们提供一个查看Android源代码的网站:http://androidxref.com/。网站首页如图1.9所示。
图1.9 AndroidXRef1
图1.10展示了该网站中Android 5.0版本的源代码搜索界面。
图1.10 AndroidXRef2
这里就是我们整个Android图书馆的索引了,每个目录都具有不同的功能和目的,而它们组成在一起,便构成了整个Android大厦,整个结构关系图如下所示。
- - Makefile
- - bionic (bionic C库)
- - bootable (启动引导相关代码)
- - build (存放系统编译规则等基础开发包配置)
- - cts (Google兼容性测试标准)
- - dalvik (dalvik虚拟机)
- - development (应用程序开发相关)
- - external (android使用的一些开源的模块)
- - frameworks (Framework框架核心)
- - hardware (厂商硬件适配层HAL代码)
- - out (编译完成后的代码输出目录)
- - packages (应用程序包)
- - prebuilt (x86和arm架构下预编译资源)
- - sdk (sdk及模拟器)
- - system (底层文件系统库、应用及组件)
- - vendor (厂商定制代码)
不过这里要注意的是,并不是所有的源代码结构都是这样。只有AOSP的Android项目才是这样一个结构,有些芯片厂商如MTK,它们的目录结构就与此不同。
Android作为手机操作系统,我们需要将源代码编译后才能使用,那么问题来了,代码编译哪家强?Eclipse?Android Studio?这些都不对,我们首先需要知道,Eclipse、Android Studio这些属于开发IDE,也就是我们的集成开发环境,它体现的是一种简化计算机与开发者的交互,然而当你接触的程序架构越来越丰富,在了解越来越深入后,你就会发现,很多事情,IDE是无法完成的,比如自动化编译、定制编译、版本控制、自动测试等。因此Android与很多语言一样,引入了Makefile机制。那么Makefile到底有什么好处呢?我们先看一下对Makefile的解释:一个像Android这样的大型工程,它的源文件不计其数,不同的功能、模块,按类型分别放置在不同的目录中,这些模块通常会有一个叫Makefile的文件来进行管理。它定义了一系列的规则来指定模块,哪些文件需要编译,以及这些文件该按照怎样的顺序去编译。甚至,它还可以配置更复杂的功能操作,比如定义编译规则,打包规则等,因为Makefile就像一个shell脚本,不仅可以使用自己的语法,也能调用操作系统的命令。
可以看到,Makefile最大的好处就是自动化编译,同时还可以做到可控制的编译,Android通过Makefile来描述Android各个组件间的联系并指导它们进行自动化编译。Makefile的语法,指定了各个源代码该如何连接并生成相应的可执行程序。这时候大家再来看看我们前面列出的Android源代码目录结构,每个目录中,还会包含更多的目录,而它的每一个最小的功能单位的目录下,都会有一个Makefile文件,这样每一级向上,通过这样一个个Makefile文件,就把整个源代码有条不紊地联系在一起了。
很多人可能对Android源代码的编译没有概念,这里举一个例子,笔者公司的电脑CPU是i7 3770,主频3.4GHz,全编一次Android的代码需要90分钟,如果没有Makefile,简直无法想象该如何去编译源代码。
1.4.2 Android系统目录
在Android手机里,系统的目录结构与源代码目录结构还是有所不同的,我们通过ADB连接上手机,通过Linux的ls命令查看Android系统的根目录,如图1.11所示。其中/system和/data是开发者非常关心的两个目录。
图1.11 Android系统目录
- /system/app/
这里面放的是一些系统的App,如图1.12所示为App目录。
图1.12 Android /system/app/目录
- /system/bin/
这里面主要放的是Linux自带的组件,如图1.13所示为bin目录。
图1.13 Android /system/bin/目录
- /system/build.prop
这里记录的是系统的属性信息,如图1.14所示。
图1.14 Android /system/build.prop
- /system/fonts/
系统字体存放目录root后可下载TTF格式字体替换原字体,达到修改系统字体的效果,如图1.15所示fonts目录。
图1.15 Android /system/fonts/目录
- /system/framework/
系统的核心文件、框架层,如图1.16所示。
图1.16 Android /system/framework/目录
- /system/lib/
存放几乎所有的共享库(.so)文件,如图1.17所示,一些手机中的.so库文件。
图1.17 Android /system/lib/目录
- /system/media/
该目录用来保存系统提示音、系统铃声,如图1.18所示。
图1.18 Android /system/media/目录
其中/system/media/audio/目录,这里面保存着Android系统默认的铃声,alarms目录是闹铃提醒,notification目录是短信或提示音,ringtones目录是来电铃声,而ui目录则是一些界面音效,如图1.19所示。
图1.19 Android /system/media/audio/目录
- /system/usr/
该目录用来保存用户的配置文件,如键盘布局、共享、时区文件等,如图1.20所示。
图1.20 Android /system/usr/目录
- /data/app/
data目录包含了用户的大部分数据信息。其中,/data/app/这个目录包含了用户安装的App或者升级的App,如图1.21所示。
图1.21 Android /data/app/目录
- /data/data/
这个目录应该是开发者访问的最多的目录了,这里包含了App的数据信息、文件信息、数据库信息等,以包名的方式来区分各个应用,如图1.22所示。
图1.22 Android /data/data/目录
- /data/system/
这个目录包含了手机的各项系统信息,如图1.23所示。
图1.23 /data/system/目录
- /data/misc/
这个目录保存了大部分的Wi-Fi、VPN信息,如图1.24所示。
图1.24 Android /data/misc/目录
1.4.3 Android App文件目录
现在终于回到了我们熟悉的应用层,大家可以长舒一口气,不用再看几个GB大小的源代码了。下面我们就以Android Studio IDE为开发环境,来分析一下Android Application的文件目录结构。
当你使用Android Studio生成一个Android Application工程后,文件目录结构如图1.25所示。
图1.25 Android Application目录</h4>
关于Eclipse和Android Studio的文件目录区别,在第2章中会进行详细讲解,简单来说,大家只需要了解一点,Android Studio中的Project就相当于Eclipse里面的Workspace,而Android Studio中的Module就相当于Eclipse里面的Project就可以了。
图1.25中,App目录中的代码为应用程序代码,而下面的Gradle Scripts为编译脚本,后面我们讲Android Studio的使用的时候,会再详细地了解它们的作用。
总体来看,Android Application的目录是比较清晰、简单的,这也得力于Android底层做的良好的封装和IDE的强大。后面我们的大部分工作都将在这个目录结构下进行操作。
