获得Android源码后,我们来分析源码结构。源码的全部工程分为如下三个部分。
①Core Project:核心工程部分,这是建立Android系统的基础,保存在根目录的各个文件夹中。
②External Project:扩展工程部分,可以使其他开源项目具有扩展功能,保存在external文件夹中。
③Package:包部分,提供了Android的应用程序,内容提供者,输入法和服务,保存在package文件夹中。
在获取的Android4.3源码目录中,包含了原始Android的目标机代码,主机编译工具和仿真环境。解压缩下载的Android4.3源码包后,第一级别目录结构的具体说明如下表所示:
表2-1 Android源码的根目录
根目录 |
描述 |
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,VPN程序
|——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系统中的音频和照相机服务。