android源码分析


获得Android源码后,我们来分析源码结构。源码的全部工程分为如下三个部分。


①Core Project:核心工程部分,这是建立Android系统的基础,保存在根目录的各个文件夹中。

②External Project:扩展工程部分,可以使其他开源项目具有扩展功能,保存在external文件夹中。

③Package:包部分,提供了Android的应用程序,内容提供者,输入法和服务,保存在package文件夹中。


在获取的Android4.3源码目录中,包含了原始Android的目标机代码,主机编译工具和仿真环境。解压缩下载的Android4.3源码包后,第一级别目录结构的具体说明如下表所示:


表2-1 Android源码的根目录
根目录描述
abiabi相关代码,应用程序二进制接口
bionicbionic C库
bootable启动引导相关代码
build存放系统编译规则及generic等基础开发配置包
ctsAndroid兼容性测试套件标准
dalvikdalvik Java虚拟机
development应用程序开发相关代码
device设备相关代码
docs介绍开源的相关文档
externalAndroid使用的一些开源的模组
frameworks核心框架——Java及C++语言,是Android应用程序的框架
gdk即时通信模块
hardware主要是硬件适配层HAL代码
kernelLinux的内核文件
libcore核心库相关
libnativehelper                        是Support functions for Android's class libraries的别名,表示动态库,是实现JNI库的基础
ndkndk相关代码。Android NDK(Android Native Development Kit)是一系列的开发工具,允许程序开发人员在Android应用程序中嵌入C/C++语言编写的非托管代码
out编译完成后的代码输出在此目录
packages应用程序包
pdkPlug Development Kit的缩写,是本地开发套件
prebuilts               x86和ARM架构下预编译的一些资源
sdkSDK及模拟器
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系统中的音频和照相机服务。


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