3.3 分析Android源码结构
获得Android源码后,可以将源码的全部工程分为如下三个部分。
● Core Project:核心工程部分,这是建立Android系统的基础,被保存在根目录的各个文件夹中。
● External Project:扩展工程部分,可以使其他开源项目具有扩展功能,被保存在“external”文件夹中。
● Package:包部分,提供了Android的应用程序、内容提供者、输入法和服务,被保存在“package”文件夹中。
无论是Android 1.5还是Android 4.4,各个版本的源码目录基本类似。在里面包含了原始Android的目标机代码、主机编译工具和仿真环境。解压缩下载的Android 4.4源码包后,第一级别目录结构的具体说明如表3-1所示。
表3-1 Android 4.4源码的根目录
续表
3.3.1 应用程序
应用程序主要是UI界面的实现,广大开发者基于SDK上开发的一个个独立的APK包,都是属于应用程序这一层的,应用程序在Android系统中处于最上层的位置。源码结构中的packages目录用来实现系统的应用程序,packages的目录结构如下所示。
通过上面的目录结构可以看出,package目录主要存放的是Android系统应用层相关的内容,包括应用程序相关的包或者资源文件,其中即包括系统自带的应用程序,又有第三方开发的应用程序,还有屏幕保护和墙纸等应用,所以源码中package目录对应着系统的应用层。
3.3.2 应用程序框架
应用程序框架是Android系统中的核心部分,也就是SDK部分,它会提供接口给应用程序使用,同时应用程序框架又会和系统服务,系统程序库,硬件抽象层有关联,所以其作用十分重要,应用程序框架的实现代码大部分都在/frameworks/base和/framwworks/av目录下,/frameworks/base的目录结构如下所示。
以上这些文件夹包含了应用程序框架层的大部分代码,正是这些目录下的文件构成了Android的应用程序框架层,暴露出接口给应用程序调用,同时衔接系统程序库和硬件抽象层,形成一个由上至下的调用过程。在/frameworks/base目录下也涉及系统服务,程序库中的一些代码,将在后面的两个小节中会再详细分析。
3.3.3 系统服务
在3.3.2中介绍了应用程序框架层的内容,了解到大部分的实现代码保存在“/frame-works/base”目录下。其实在这个目录中还有一个名为“service”的目录,里面的代码是用于实现Android系统服务的。接下来将详细介绍service目录下的内容,其目录结构如下所示。
其中在“Java”和“jni”两个目录中,分别保存了和其他服务相关的Java层和JNI层的具体实现源码。Java目录下更详细的目录结构以及其他Android系统服务的说明如下所示。
从上面的文件和文件夹可以看出,Android中涉及的服务种类非常多,包括界面,网络,电话等核心模块基本上都有其专属的服务,这些是属于系统级别的服务,这些系统服务一般都会在Android系统启动时加载,在系统关闭时结束,受到系统的管理,应用程序并没有权力去打开或者关闭,它们会随着系统的运行一直在后台运行,供应用程序和其他组件使用。
另外在frameworks/av/下面也有一个services目录,这个目录下存放的是音频和照相机服务的实现代码,目录结构如下所示。
这个av/services目录下的文件主要用来支持Android系统中的音频和照相机服务,这是两个非常重要的系统服务,开发应用程序会经常依赖这两个服务。
3.3.4 系统程序库
Android的系统程序库类型非常多,功能也非常强大,正是有了这些程序库,Android系统才能运行多种多样的应用程序。在接下来的内容中,笔者挑选了一些很常用也是很重要的系统程序库来分析它们在源码中所处的位置。
(1)系统C库
Android系统采用的是一个从BSD继承而来的、标准的系统函数库bionic,在源码根目录下有这个文件夹,其目录结构如下所示。
(2)媒体库
Android中的媒体库在Android 2.3之前是由OpenCore实现的,Android 2.3之后Stragefright被替换了,OpenCore成为了新的多媒体的实现库。同时Android也自带了一些音视频的管理库,用于管理多媒体的录制、播放、编码和解码等功能。Android的多媒体程序库的实现代码主要在/frameworks/av/media目录下,其目录结构如下所示。
(3)图层显示库
Android中的图层显示库主要负责对显示子系统的管理,负责图层的渲染,叠加,绘制等功能,提供了2D和3D图层的无缝融合,是整个Android系统显示的“大脑中枢”,其代码在/frameworks/native/services/surfaceflinger/目录下,其目录结构如下所示。
(4)网络引擎库
网络引擎库主要是用来实现Web浏览器的引擎,支持Android的Web浏览器和一个可嵌入的Web视图,这个是采用第三方开发的浏览器引擎Webkit实现的,Webkit的代码在/external/webkit/目录下,其目录结构如下所示。
(5)3D图形库
Android中的3D图形渲染是采用Opengl来实现的,Opengl是开源的第三方图形渲染库,使用该库可以实现Android中的3D图形硬件加速或者3D图形软件加速功能,是一个非常重要的功能库。从Android 4.3开始,支持最新、最强大的OpenGL ES 3.0。其实现代码在/frame-works/native/opengl中,其目录结构如下所示。
(6)SQLite
SQLite是Android系统自带的一个轻量级关系数据库,其实现源代码已经在网上开源。SQLite的优点是操作简单方便,运行速度较快,占用资源较少等,比较适合在嵌入式设备上使用。SQLite是Android系统自带的实现数据库功能的核心库,其代码实现分为Java和C两个部分,Java部分的代码在/frameworks/base/core/java/android/database,目录结构如下所示。
Java层的代码主要是实现SQLite的框架和接口的实现,方便用户开发应用程序时能很简单的操作数据库,并且捕获数据库异常。
C++层的代码在/external/sqlite路径下,其目录结构如下所示。
从上面Java和C部分的代码目录结构可以看出,SQLite在Android中还是有很重要的地位的,并且在SDK中会有开放的接口让应用程序可以很简单方便的操作数据库,对数据进行存储和删除。
3.3.5 系统运行库
众所周知,Android系统的应用层是采用Java开发的,由于Java语言的跨平台特性,Java代码必须运行在虚拟机中。正是因为这个特性,Android系统也自己实现了一个类似JVM但是更适用于嵌入式平台的Java虚拟机,这被称为dalvik。
dalvik功能等同于JVM,为Android平台上的Java代码提供了运行环境,dalvik本身是由C++语言实现的,在源码中根目录下有dalvik文件夹,里面存放的是dalvik虚拟机的实现代码,其目录结构如下所示。
正是有上面这些代码实现的Android虚拟机,所以应用程序生成的二进制执行文件能够快速、稳定地运行在Android系统上。
3.3.6 硬件抽象层
Android的硬件抽象是各种功能的底层实现,理论上不同的硬件平台会由不同的硬件抽象层实现,这一个层次也是和驱动层和硬件层有紧密联系的,起着承上启下的作用,对上要实现应用程序框架层的接口,对下要实现一些硬件基本功能,以及调用驱动层的接口。需要注意的是,这一层也是广大OEM厂商改动最大的一层,因为这一层的代码和终端采用什么样的硬件平台有很大关系。源码中存放的是硬件抽象层框架的实现代码和一些平台无关性的接口的实现。硬件抽象层代码在源码根目录下的hardware文件夹中,其目录结构如下所示。
从上面的目录结构可以看出,硬件抽象层中主要是实现了一些底层的硬件库,用来实现应用层框架层中的功能,具体硬件库中有哪些内容,可以继续细分其目录结构,libhardware目录下的结构如下所示。
从上面的目录结构可以分析出,libhardware目录主要是Android系统的某些功能的底层实现,包括audio,nfc,power。
libhardware_legacy的目录与libhardware大同小异,只是是针对旧的实现方式做的一套硬件库,其目录下还有uevent、Wi-Fi以及虚拟机的底层实现。这两个目录下的代码一般会由设备厂家根据自身的硬件平台来实现符合Android机制的硬件库。
ril目录下存放的是无线硬件设备与电话的实现,其目录结构如下所示。