Android系统架构与系统源码目录
1.Android系统架构
Android系统架构分为五层,从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。
应用层
系统内置的应用程序以及非系统级的应用程序都是属于应用层。负责与用户进行直接交互,通常都是用Java进行开发的。
应用框架层(Java Framework)
应用框架层为开发人员提供了可以开发应用程序所需要的API,我们平常开发应用程序都是调用的这一层所提供的API,当然也包括系统的应用。这一层的是由Java代码编写的,可以称为Java Framework。下面来看这一层所提供的主要的组件。
名称 | 功能描述 |
---|---|
Activity Manager(活动管理器) | 管理各个应用程序生命周期以及通常的导航回退功能 |
Location Manager(位置管理器) | 提供地理位置以及定位功能服务 |
Package Manager(包管理器) | 管理所有安装在Android系统中的应用程序 |
Notification Manager(通知管理器) | 使得应用程序可以在状态栏中显示自定义的提示信息 |
Resource Manager(资源管理器) | 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等 |
Telephony Manager(电话管理器) | 管理所有的移动设备功能 |
Window Manager(窗口管理器) | 管理所有开启的窗口程序 |
Content Providers(内容提供器) | 使得不同应用程序之间可以共享数据 |
View System(视图系统) | 构建应用程序的基本组件 |
系统运行库层(Native)
系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。下面分别来介绍它们。
1.C/C++程序库
C/C++程序库能被Android系统中的不同组件所使用,并通过应用程序框架为开发者提供服务,主要的C/C++程序库如下表2所示。
名称 | 功能描述 |
---|---|
OpenGL ES | 3D绘图函数库 |
Libc | 从BSD继承来的标准C系统函数库,专门为基于嵌入式Linux的设备定制 |
Media Framework | 多媒体库,支持多种常用的音频、视频格式录制和回放。 |
SQLite | 轻型的关系型数据库引擎 |
SGL | 底层的2D图形渲染引擎 |
SSL | 安全套接层,是为网络通信提供安全及数据完整性的一种安全协议 |
FreeType | 可移植的字体引擎,它提供统一的接口来访问多种字体格式文件 |
2.Android运行时库
运行时库又分为核心库和ART(5.0系统之后,Dalvik虚拟机被ART取代)。核心库提供了Java语言核心库的大多数功能,这样开发者可以使用Java语言来编写Android应用。相较于JVM,Dalvik虚拟机是专门为移动设备定制的,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。而替代Dalvik虚拟机的ART 的机制与Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在第一次安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。
硬件抽象层(HAL)
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,其目的在于将硬件抽象化,为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。 从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。
Linux内核层
Android 的核心系统服务基于Linux 内核,在此基础上添加了部分Android专用的驱动。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型等都依赖于该内核。
Android系统的五层架构就讲到这,了解以上的知识对以后分析系统源码有很大的帮助。
2.Android系统源码目录
我们要先了解Android系统源码目录,为后期源码学习打下基础。关于源码的阅读,你可以访问http://androidxref.com/来阅读系统源码。当然,最好是将源码下载下来。下载源码可以使用清华大学开源软件镜像站提供的Android 镜像:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 。如果觉得麻烦也可以查找国内的网盘进行下载,推荐使用该百度网盘地址下载:http://pan.baidu.com/s/1ngsZs,它提供了多个Android版本的的源码下载。
整体结构
各个版本的源码目录基本是类似,如果是编译后的源码目录会多增加一个out文件夹,用来存储编译产生的文件。Android7.0的根目录结构说明如下表所示。
Android源码根目录 | 描述 |
---|---|
abi | 应用程序二进制接口 |
art | 全新的ART运行环境 |
bionic | 系统C库 |
bootable | 启动引导相关代码 |
build | 存放系统编译规则及generic等基础开发包配置 |
cts | Android兼容性测试套件标准 |
dalvik | dalvik虚拟机 |
developers | 开发者目录 |
development | 应用程序开发相关 |
device | 设备相关配置 |
docs | 参考文档目录 |
external | 开源模组相关文件 |
frameworks | 应用程序框架,Android系统核心部分,由Java和C++编写 |
hardware | 主要是硬件抽象层的代码 |
libcore | 核心库相关文件 |
libnativehelper | 动态库,实现JNI库的基础 |
ndk | NDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码 |
out | 编译完成后代码输出在此目录 |
packages | 应用程序包 |
pdk | Plug Development Kit 的缩写,本地开发套件 |
platform_testing | 平台测试 |
prebuilts | x86和arm架构下预编译的一些资源 |
sdk | sdk和模拟器 |
system | 底层文件系统库、应用和组件 |
toolchain | 工具链文件 |
tools | 工具文件 |
Makefile | 全局Makefile文件,用来定义编译规则 |
从表3可以看出,系统源码分类清晰,并且内容庞大且复杂。接下来分析packages中的内容,也就是应用层部分。
应用层部分
应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。源码根目录中的packages目录对应着系统应用层。它的目录结构如表4所示。
packages目录 | 描述 |
---|---|
apps | 核心应用程序 |
experimental | 第三方应用程序 |
inputmethods | 输入法目录 |
providers | 内容提供者目录 |
screensavers | 屏幕保护 |
services | 通信服务 |
wallpapers | 墙纸 |
从目录结构可以发现,packages目录存放着系统核心应用程序、第三方的应用程序和输入法等等,这些应用都是运行在系统应用层的,因此packages目录对应着系统的应用层。
应用框架层部分
应用框架层是系统的核心部分,一方面向上提供接口给应用层调用,另一方面向下与C/C++程序库以及硬件抽象层等进行衔接。 应用框架层的主要实现代码在/frameworks/base和/frameworks/av目录下,其中/frameworks/base目录结构如表5所示。
/frameworks/base目录 | 描述 | /frameworks/base目录 | 描述 |
---|---|---|---|
api | 定义API | cmds | 重要命令:am、app_proce等 |
core | 核心库 | data | 字体和声音等数据文件 |
docs | 文档 | graphics | 图形图像相关 |
include | 头文件 | keystore | 和数据签名证书相关 |
libs | 库 | location | 地理位置相关库 |
media | 多媒体相关库 | native | 本地库 |
nfc-extras | NFC相关 | obex | 蓝牙传输 |
opengl | 2D/3D 图形API | packages | 设置、TTS、v*n程序 |
sax | XML解析器 | services | 系统服务 |
telephony | 电话通讯管理 | test-runner | 测试工具相关 |
tests | 测试相关 | tools | 工具 |
wifi | wifi无线网络 |
C/C++程序库部分
系统运行库层(Native)中的 C/C++程序库的类型繁多,功能强大,C/C++程序库并不完全在一个目录中,这里给出几个常用且比较重要的C/C++程序库所在的目录位置。
目录位置 | 描述 |
---|---|
bionic/ | Google开发的系统C库,以BSD许可形式开源。 |
/frameworks/av/media | 系统媒体库 |
/frameworks/native/opengl | 第三方图形渲染库 |
/frameworks/native/services/surfaceflinger | 图形显示库,主要负责图形的渲染、叠加和绘制等功能 |
external/sqlite | 轻量型关系数据库SQLite的C++实现 |
讲完 C/C++程序库部分,剩下的部分我们在表3已经给出:Android运行时库的代码放在art/目录中。硬件抽象层的代码在hardware/目录中,这一部分是手机厂商改动最大的一部分,根据手机终端所采用的硬件平台会有不同的实现。
详细源码目录如下(Android 系统源码4.3)
获得Android源码后,我们来分析源码结构。源码的全部工程分为如下三个部分。
①Core Project:核心工程部分,这是建立Android系统的基础,保存在根目录的各个文件夹中。
②External Project:扩展工程部分,可以使其他开源项目具有扩展功能,保存在external文件夹中。
③Package:包部分,提供了Android的应用程序,内容提供者,输入法和服务,保存在package文件夹中。
在获取的Android4.3源码目录中,包含了原始Android的目标机代码,主机编译工具和仿真环境。解压缩下载的Android4.3源码包后,第一级别目录结构的具体说明如下表所示:
根目录 | 描述 |
abi | abi相关代码,应用程序二进制接口 |
bionic | bionic C库 |
bootable | 启动引导相关代码 |
build | 存放系统编译规则及generic等基础开发配置包 |
cts | Android兼容性测试套件标准 |
dalvik | dalvik Java虚拟机 |
development | 应用程序开发相关代码 |
device | 设备相关代码 |
docs | 介绍开源的相关文档 |
external | Android使用的一些开源的模组 |
frameworks | 核心框架——Java及C++语言,是Android应用程序的框架 |
gdk | 即时通信模块 |
hardware | 主要是硬件适配层HAL代码 |
kernel | Linux的内核文件 |
libcore | 核心库相关 |
libnativehelper | 是Support functions for Android's class libraries的别名,表示动态库,是实现JNI库的基础 |
ndk | ndk相关代码。Android NDK(Android Native Development Kit)是一系列的开发工具,允许程序开发人员在Android应用程序中嵌入C/C++语言编写的非托管代码 |
out | 编译完成后的代码输出在此目录 |
packages | 应用程序包 |
pdk | Plug Development Kit的缩写,是本地开发套件 |
prebuilts | x86和ARM架构下预编译的一些资源 |
sdk | SDK及模拟器 |
system | 文件系统和应用及组件,是用C语言实现的 |
tools | 工具文件夹 |
vendor | 厂商定制代码 |
Makefile | 全局的Makefile |
文件夹目录如下:
1.Android源码的目录结构
当下载好Android源码后,可以看到,第一级目录有18个文件夹和一个Makefile文件,如果是编译后的源码目录,会增加一个out文件夹,用来存放编译产生的文件,下面具体来分析一下这些目录各自的作用:
|——abi //应用程序的二进制接口
|——bionic //Android基础C库的源码
|——bootable //系统启动器的源码
|——build //编译和配置系统所需要的配置文件和脚本文件
|——cts //Android兼容性测试标准
|——dalvik //Android虚拟机源码
|——development //程序开发的模板和工具
|——device //设备相关代码
|——docs //开源的相关文档
|——external //Android使用的第三方开源库的源码
|——frameworks //应用程序框架源码
|——gdk //即时通信模块
|——hardware //硬件抽象层源码
|——libcore //相关核心库的代码
|——libnativehelper //动态库
|——ndk //NDK开发环境
|——packages //应用程序包
|——pdk //本地开发套件
|——prebuilt //x86和ARM架构下预编译的一些资源
|——sdk //SDK和模拟器相关代码
|——system //文件系统,应用和组件
|——Makefile //系统编译脚本
通过上面对源码根目录中的每个文件夹的介绍,可以看出源码是按照功能进行分类的,整个Android源码分为系统代码,工具,文档,开发环境,虚拟机,配置脚本和编译脚本等类别。
2.应用程序
在Android源码中,应用程序部分的功能是实现UI界面,开发人员基于SDK开发的APK包便属于应用程序层。应用程序层在Android系统中处于最顶层,Android 4.3源码结构中的packages目录用来实现系统的应用程序,此目录的具体结构如下所示:
packages /
|——apps //应用程序库
|——|——BasicSmsReceiver//基础短信接收
|——|——Bluetooth//蓝牙
|——|——Browser//浏览器
|——|——Calculator//计算器
|——|——Calendar//日历
|——|——Camera//照相机
|——|——CellBroadcastReceiver//单元广播接收
|——|——CertInstaller//被调用的包,在Android中安装数字签名
|——|——Contacts//联系人
|——|——DeskClock//桌面时钟
|——|——Email//电子邮件
|——|——Exchange//Exchange服务
|——|——Gallery//图库
|——|——Gallery2//图库2
|——|——HTMLViewer//HTML查看器
|——|——KeyChain//密码管理
|——|——Launcher2 //启动器
|——|——Mms//彩信
|——|——Music//音乐
|——|——MusicFX//音频增强
|——|——Nfc//近场通信
|——|——PackageInstaller//包安装器
|——|——Phone//电话
|——|——Protips//主屏幕提示
|——|——Provision//引导设置
|——|——QuickSearchBox//快速搜索框
|——|——Settings//设置
|——|——SoundRecorder//录音机
|——|——SpareParts//系统设置
|——|——SpeechRecorder//录音程序
|——|——Stk//sim卡相关
|——|——Tag//标签
|——|——VideoEditor//视频编辑
|——|——VoiceDialer//语音编号
|——experimental//非官方的应用程序
|——|——BugReportSender//Bug的报告程序
|——|——Bummer
|——|——CameraPreviewTest//照相机预览测试程序
|——|——DreaamTheater
|——|——ExampleImsFramework
|——|——LoaderApp
|——|——NotificationLog
|——|——NotificationShowcase
|——|——procstatlog
|——|——RpcPerformance
|——|——StrictModeTest
|——inputmethods//输入法
|——|——LatinIME//拉丁文输入法
|——|——OpenWnn//OpenWnn输入法
|——|——PinyinIME//拼音输入法
|——providers//提供器
|——|——ApplicationsProvider//应用程序提供器,提供应用程序所需的界面
|——|——CalendarProvider//日历提供器
|——|——ContactsProvider//联系人提供器
|——|——DownloadProvider//下载管理提供器
|——|——DrmProvider//数据库相关
|——|——GoogleContactsProvider//Google联系人提供器
|——|——MediaProvider//媒体提供器
|——|——TelephonyProvider//彩信提供器
|——|——UserDictionaryProvider//用户字典提供器
|——screensavers//屏幕保护
|——|——Basic//基本屏幕保护
|——|——PhotoTable//照片方格
|——|——WebView //网页
|——wallpapers//墙纸
|——|——Basic//系统内置墙纸
|——|——Galaxy4//S4内置墙纸
|——|——HoloSpiral//手枪皮套墙纸
|——|——LivePicker
|——|——MagicSmoke
|——|——MusicVisualization
|——|——NoiseField
|——|——PhaseBeam
通过上面的目录结构可以看出,在packages目录中包含了应用程序相关的包或者资源文件,不但包括系统自带的应用程序,也包括第三方开发的应用程序和屏幕保护和墙纸等应用。
3.应用程序框架
应用程序框架是Android系统中的核心部分,也就是SDK部分,它会提供接口给应用程序使用,同时应用程序框架又会与系统服务,系统程序库,硬件抽象层的关联,所以其作用十分重大,应用程序框架的实现代码大部分都在/frameworks/base和/frameworks/av目录下。
frameworks/base的目录结构如下所示:
frameworks/base
|——api //全是XML文件,定义了API
|——cmds //Android中的重要命令(am,app_proce等)
|——core //核心库
|——data //声音字体等数据文件
|——docs //文档
|——drm //数字版权管理
|——graphics //图形图像
|——icu4j //用于解决国际化问题
|——include //头文件
|——keystore //数字签名证书相关
|——libs //库
|——location //地理位置
|——media //多媒体
|——native //本地库
|——nfc-extras //NFC相关
|——obex //蓝牙传输
|——opengl //OpenGL相关
|——packages //设置,TTS,v*n程序
|——policy //锁屏界面相关
|——sax //XML解析器
|——services //Android服务
|——telephony //电话相关
|——test-runner //测试相关
|——tests //测试相关
|——tools //工具
|——voip //可视通话
|——wifi //无线网络
以上这些文件包含了应用程序框架层的大部分代码,正是这些目录下的文件构成了Android的应用程序框架层,暴露出接口给应用程序调用,同时衔接系统程序库和硬件抽象层,形成一个由上至下的调用过程。
4.系统服务
Android应用程序框架层的大部分实现代码被保存在/frameworks/base目录下,其实在这个目录中还有一个名为service的目录,里面的代码用于实现Android系统服务,其目录结构如下所示:
frameworks/base/services
|——common_time //日期时间相关的服务
|——input //输入系统服务
|——java //其他重要服务的Java层
|——jni //其他重要服务的JNI层
|——tests //测试相关
其中java和jni两个目录分别是一些其他的服务的Java层和JNI层实现,java目录下的目录结构以及其他Android系统服务的相关说明如下所示:
frameworks/base/services/java/com/android/server
|——accessibility
|——am
|——connectivity
|——display
|——dreams
|——drm
|——input
|——location
|——net
|——pm
|——power
|——updates
|——usb
\——wm
|——AlarmManagerService.java//闹钟服务
|——AppWidgetService.java//应用程序小工具服务
|——AppWidgetServiceImpl.java
|——AttributeCache.java
\——BackupManagerService.java//备份服务
|——BatteryService.java//电池相关服务
|——BluetoothManagerService.java//蓝牙
|——BootReceiver.java
|——BrickReceiver.java
|——CertBlacklister.java
|——ClipboardService.java
|——CommonTimeManagementService.java//时间管理服务
|——ConnectivityService.java
|——CountryDetectorService.java
|——DevicePolicyManagerService.java
|——DeviceStorageMonitorService.java//设备存储器监听服务
|——DiskStatsService.java//磁盘状态服务
|——DockObserver.java//底座监视服务
|——DropBoxManagerService.java
|——EntropyMixer.java
|——EventLogTags.logtags
|——INativeDaemonConnectorCallbacks.java
|——InputMethodManagerService.java//输入法管理服务
|——IntentResolver.java
|——IntentResolverOld.java
|——LightsService.java
|——LocationManagerService.java//地理位置服务
|——MasterClearReceiver.java
|——MountService.java//挂载服务
|——NativeDaemonConnector.java
|——NativeDaemonConnectorException.java
|——NativeDaemonEvent.java
|——NetworkManagementService.java//网络管理服务
|——NetworkTimeUpdateService.java
|——NotificationManagerService.java//通知服务
|——NsdService.java
|——PackageManagerBackupAgent.java
|——PreferredComponent.java
|——ProcessMap.java
|——RandomBlock.java
|——RecognitionManagerService.java
|——SamplingProfilerService.java
|——SerialService.java//NFC相关
|——ServiceWatcher.java
|——ShutdownActivity.java
|——StatusBarManagerService.java//状态栏管理服务
|——SystemBackupAgent.java
|——SystemService.java
|——TelephonyRegistry.java
|——TextServicesManagerService.java
|——ThrottleService.java
|——TwilightCalculator.java
|——TwilightService.java
|——UiModeManagerService.java
|——UpdateLockService.java//锁屏更新服务
|——VibratorService.java//震动服务
|——WallpaperManagerService.java//壁纸服务
|——Watchdog.java//看门狗
|——WifiService.java//无线网络服务
|——WiredAccessoryManager.java//无线设备管理服务
从上面的文件夹和文件可以看出,Android中涉及的服务种类有:界面,网络,电话等核心模块,这些专属服务是系统级别的服务,这些系统服务一般都会在Android系统启动的时候加载,在系统关闭的时候结束,受到系统的管理,应用程序并没有权力去打开或者关闭,它们会随着系统的运行一直在后台运行,供应用程序和其他组件来使用。
另外,在framework/av/目录下面有一个services目录,在此目录中存放的是音频和照相机的服务的实现代码,此目录的具体结构如下所示:
frameworks/av/services
|——audioflinger//音频管理服务
|——camera//照相机的管理服务
av/services目录主要用来支持Android系统中的音频和照相机服务。
5.系统程序库
Android4.3程序库的类型非常多,功能也非常强大。在接下来的内容中,将简要讲解Android4.3源码中的一些常用并且重要的系统程序库的知识。
㈠系统C库
Android系统采用的是一个从BSD继承而来的标准的系统函数库bionic,在源码根目录下有这个文件夹,其目录结构如下所示:
bionic/
|——libc//C库
|——libdl//动态链接库相关
|——libm //数学库
|——libstdc++ //C++实现库
|——libthread_db //线程库
|——linker //连接器相关
|——test //测试相关
㈡媒体库
Android中的媒体库在2.3版之前是由OpenCore实现的,2.3版之后Stragefright被替换了,OpenCore成为新的多媒体的实现库。同时Android自带了一些音视频的管理库,用于管理多媒体的录制,播放,编码和解码等功能。
Android的多媒体程序库的实现代码主要在/frameworks/av/media目录中,其目录结构如下:
frameworks/av/media/
|——common_time //时间相关
|——libeffects //多媒体效果
|——libmedia //多媒体录制,播放
|——libmedia_native //里面只有一个Android。迥,用来编译native文件
|——libmediaplayerservice//多媒体播放服务的实现库
|——libstagefright //Stagefright的实现库
|——mediaserver //跨进程多媒体服务
|——mtp //MTP协议的实现(媒体传输协议)
㈢图层显示库
Android中的图层显示库主要负责对显示子系统的管理,负责图层的渲染,叠加,绘制等功能,提供了2D和3D图层的无缝融合,是整个Android系统显示的“大脑中枢”,其代码在/frameworks/native/services/surfaceflinger/目录下,其目录结构如下所示:
frameworks/native/services/surfaceflinger/
|——DisplayHardware//显示底层相关
|——tests//测试
|——Android.mk//MakeFile文件
|——Barrier.h
|——Client.cpp//显示的客户端实现文件
|——Client.h
|——clz.cpp
|——clz.h
|——DdmConnection.cpp
|——DdmConnection.h
|——DisplayDevice.cpp//显示设备相关
|——DisplayDevice.h
|——EventThread.cpp//消息线程
|——EventThread.h
|——GLExtensions.cpp//OpenGL扩展
|——GLExtensions.h
|——Layer.cpp//图层相关
|——Layer.h
|——LayerBase.cpp//图层基类
|——LayerBase.h
|——LayerDim.cpp//图层相关
|——LayerDim.h
|——LayerScreenshot.cpp//图层相关
|——LayerScreenshot.h
|——MessageQueue.cpp//消息队列
|——MessageQueue.h
|——MODULE_LICENSE_APACHE2//证书
|——SurfaceFlinger.cpp//图层管理者,图层管理的核心类
|——SurfaceFlinger.h
|——SurfaceTextureLayer.cpp//文字图层
|——SurfaceTextureLayer.h
|——Transform.cpp
|——Transform.h
㈣网络引擎库
网络引擎库主要是用来实现Web浏览器的引擎,支持Android的Web浏览器和一个可嵌入的Web视图,这是采用第三方开发的浏览器引擎Webkit实现的,Webkit的代码在/external/webkit/目录下,其目录结构如下所示:
external/webkit/
|——Examples //Webkit的例子
|——LayoutTests//布局测试
|——PerformanceTests//表现测试
|——Source//Webkit源代码
|——Tools//工具
|——WebKitLibraries//Webkit用到的库
|——Android.mk//Makefile
|——bison_check.mk
|——CleanSpec.mk
|——MODULE_LICENSE_LGPL//证书
|——NOTICE
|——WEBKIT_MERGE_REVISION//版本信息
㈤3D图形库
Android中的3D图形渲染是采用OpenGL来实现的,OpenGl是开源的第三方图形渲染库,使用该库可以实现Android中的3D图形硬件加速或者3D图形软件加速功能,是一个非常重要的功能库。从Android 4.3开始,支持最新,最强大的OpenGL ES3.0.其实现代码在/frameworks/native/opengl中,其目录结构如下所示:
frameworks/native/opengl/
|——include //OpenGL中的头文件
|——libagl //在Mac OS上的库
|——libs //OpenGL的接口和实现库
|——specs //OpenGL的文档
|——tests //测试相关
|——tools //工具库
㈥SQLite
SQLite是Android系统自带的一个轻量级关系数据库,其实现源代码已经在网上开源。SQLite的优点是操作方便,运行速度较快,占用资源较少等,比较适合在嵌入式设备上面使用。SQLite是Android系统自带的实现数据库功能的核心库,其代码实现分为Java和C两个部分,Java部分的代码位于/frameworks/base/core/java/android/database,目录结构如下所示:
frameworks/base/core/java/android/database/
|——sqlite//SQLite的框架文件
|——AbstractCursor.java//游标的抽象类
|——AbstractWindowedCursor.java
|——BulkCursorDescriptor.java
|——BulkCursorNative.java
|——BulkCursorToCursorAdaptor.java//游标适配器
|——CharArrayBuffer.java
|——ContentObservable.java
|——ContentObserver.java
|——CrossProcessCursor.java
|——CrossProcessCursorWrapper.java//CrossProcessCursor的封装类
|——Cursor.java//游标实现娄
|——CursorIndexOutOfBoundsException.java//游标出界异常
|——CursorJoiner.java
|——CursorToBulkCursorAdaptor.java//适配器
|——CursorWindow.java//游标窗口
|——CursorWindowAllocationException.java//游标窗口异常
|——CursorWrapper.java//游标封装类
|——DatabaseErrorHandler.java//数据库错误句柄
|——DatabaseUtils.java//数据库工具类
|——DataSetObservable.java
|——DataSetObserver.java
|——DefaultDatabaseErrorHandle.java//默认数据库错误句柄
|——IBulkCursor.java
|——IContentObserver.aidl//aidl用于跨进程通信
|——MatrixCursor.java
|——MergeCursor.java
|——Observable.java
|——package.html
|——SQLException.java//数据库异常
|——StaleDataException.java
Java层的代码主要是实现SQLite的框架和接口的实现,使用户开发应用程序时能很简单地操作数据库,并且捕获数据库异常。
C++层的代码在/external/sqlite路径下,其目录结构如下所示:
external/sqlite/
|——android //Android数据库的一些工具包
|——dist //Android数据库底层实现
从上面Java和C部分的代码目录结构可以看出,SQLite在Android中还是有很重要的地位的,并且在SDK中会有开放的接口让应用程序可以很简单方便地操作数据库,对数据进行存储和删除。
6.系统运行库
众所周知,Android系统折应用层是采用Java开发的,由于Java语言的跨平台特性,Java代码必须运行在虚拟机中。正是因为这个特性,Android系统也自己实现了一个类似JVM但是更适用于嵌入式平台的Java虚拟机,这被称为dalvik。
dalvik功能等同于JVM,为Android平台上的Java代码提供了运行环境,dalvik本身是由C++语言实现的,在源码中的根目录下有dalvik文件夹,里面存放的是dalvik虚拟机的实现代码,其目录结构如下所示:
dalvik/
|——dalvikvm //入口目录
|——dexdump //dex反汇编
|——dexgen //dex生成相关
|——dexlist //dex列表
|——dexopt //与验证和优化
|——docs //文档
|——dvz //zygot相关
|——dx //dx工具,将多个Java转换为dex
|——hit
|——libdex //dex库的实现代码
|——opcode-gen
|——tests //测试相关
|——tools //工具
|——unit-tests //测试相关
|——vm //虚拟机的实现
|——Android.mk //Makefile
|——CleanSpec.mk
|——MODULE_LICENSE_APACHE2
|——NOTICE
|——README.txt
正是因为的上面这些代码实现的Android虚拟机,所以应用程序生成的二进制执行文件能够快速,稳定运行在Android系统上。
7.硬件抽象层
Android的硬件抽象是各种功能的底层实现,理论上,不同的硬件平台会有不同的硬件抽象层实现,这一个层次也是与驱动层和硬件层有紧密联系的,起着承上启下的作用,对上要实现应用程序框架层的接口,对下要实现一些硬件的基本功能,以及调用驱动层的接口。需要注意的是,这一层也是广大OEM厂商改动最大的一层,因为这一层的代码跟终端采用什么样硬件的硬件平台的很大的关系。源码中存放的是硬件抽象层框架的实现代码和一些平台无关的接口的实现。硬件抽象层代码在源码根目录下的hardware文件夹中,其目录结构如下所示:
hardware/
|——libhardware//新机制硬件库
|——libhardware_legacy//旧机制硬件库
|——ril//ril模块相关的底层实现
从上面的目录结构我们可以看出,硬件抽象层中主要是实现了一些底层的硬件库,用来实现应用层框架中的功能,至于其体硬件库中的哪些内容,我们可以继续分其目录结构,例如libhardware目录下的结构为:
hardware/libhardware/
|——include//入口目录
|——modules//dex反汇编
|——|——audio //音频相关底层库
|——|——audio_remote_submix//音频混合相关
|——|——gralloc //帧缓冲
|——|——hwcomposer //音频相关
|——|——local_time //本地时间
|——|——nfc //nfc功能
|——|——nfc-nci //nfc接口
|——|——power //电源
|——|——usbaudio //USB音频设备
|——|——Android.mk //Makefile
|——|——README.android
|——tests //dex生成相关
|——dexlist //dex列表
|——dexopt //验证和优化
|——docs //文档
从上面的目录结构我们可以分析出,libhardware目录主要是Android系统的某些功能的底层实现,包括audio,nfc,power。
libhardware_legacy目录与libhardware大同小异,只是针对旧的实现方式做的一套硬件库,其目录下还有uevent,wifi以及虚拟机的底层实现。这两个目录下的代码一般会由设备厂家根据自身的硬件平台来实现符合Android机制的硬件库。
ril目录下存放的是无线硬件设备与电话的实现,其目录结构如下所示:
hardware/ril/
|——include //头文件
|——libril //libril库
|——mock-ril
|——reference-ril //reference ril库
|——rild //ril守护进程
|——CleanSpec.mk