前言:Android官方在线看源码地址
https://cs.android.com/
1.Android系统架构
Android系统架构分为五层,从上到下依次是应用层、应用框架层、系统运行库层、硬件抽象层和Linux内核层。
AOSP 架构
AOSP 的软件堆栈包含以下层:
图 1. AOSP 软件堆栈架构。
下面列出了图 1 中使用的术语的定义:
-
Android 应用
完全使用 Android API 开发的应用。Google Play 商店广泛用于查找和下载 Android 应用,不过也有许多其他替代方案。在某些情况下,设备制造商可能希望预安装 Android 应用以支持设备的核心功能。如果您对开发 Android 应用感兴趣,请访问 developers.android.com
-
特权应用
使用 Android 和系统 API 组合创建的应用。这些应用必须作为特权应用预安装在设备上。
-
设备制造商应用
结合使用 Android API、系统 API 并直接访问 Android 框架实现而创建的应用。由于设备制造商可能会直接访问 Android 框架中的不稳定的 API,因此这些应用必须预安装在设备上,并且只能在设备的系统软件更新时进行更新。
-
系统 API
系统 API 表示仅供合作伙伴和 OEM 纳入捆绑应用的 Android API。这些 API 在源代码中被标记为 @SystemApi。
-
Android API
Android API 是面向第三方 Android 应用开发者的公开 API。如需了解 Android API,请参阅 Android API 参考文档。
-
Android 框架
构建应用所依据的一组 Java 类、接口和其他预编译代码。框架的某些部分可通过使用 Android API 公开访问。框架的其他部分只能由 OEM 通过系统 API 来访问。Android 框架代码在应用进程内运行。
-
系统服务
系统服务是重点突出的模块化组件,例如
system_server
、SurfaceFlinger 和 MediaService。Android 框架 API 提供的功能可以与系统服务进行通信,以访问底层硬件。 -
Android 运行时 (ART)
AOSP 提供的 Java 运行时环境。 ART 会将应用的字节码转换为由设备运行时环境执行的处理器专有指令。
-
硬件抽象层 (HAL)
HAL 是一个抽象层,其中包含硬件供应商要实现的标准接口。借助 HAL,Android 可以忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。如需了解详情,请参阅 HAL 概览。
-
原生守护程序和库
该层中的原生守护程序包括
init
、healthd
、logd
和storaged
。这些守护程序直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。该层中的原生库包括
libc
、liblog
、libutils
、libbinder
和libselinux
。这些原生库直接与内核或其他接口进行交互,并且不依赖于基于用户空间的 HAL 实现。 -
内核
内核是任何操作系统的中心部分,并与设备上的底层硬件进行通信。尽可能将 AOSP 内核拆分为与硬件无关的模块和特定于供应商的模块。如需了解 AOSP 内核组件的说明(包括其定义),请参阅内核概览。
应用层
系统内置的应用程序以及非系统级的应用程序都是属于应用层。负责与用户进行直接交互,通常都是用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(视图系统) | 构建应用程序的基本组件 |
表1
系统运行库层(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
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运行环境,Android5.0之后java虚拟机就使用ART |
bionic | 系统C库,Android改造的C/C++库, 比传统的glibc更精简,不受GPL限制,支持 pthread_cancel(), 不支持C++ exception和C++ STL模板编程 |
bootable | 启动引导相关代码 包含了recovery程序(恢复出厂/升级)的代码 |
build | 存放系统编译规则及generic等基础开发包配置 Android编译系统,定义了各种编译规则,并包含通用产品配置 |
cts | Android兼容性测试套件标准,CTS 是一个自动化测试套件,包含PC端和设备端(被测设备), 对手机的硬件,软件,接口,性能进行测试 ,测试项目包含平台 API 测试,平台 Intent,蓝牙设备的连接状况, 相机拍照功能等,通过make cts编译, out/host/linux-x86/cts/下生成android-cts文件夹。由于Android是开源的,对于Google Android的开发联盟中的Motorola、Samsung、Qualcomm 、Sony Ericsson、中国移动、ZTE、华为等,底层的代码也是开放的。手机制造商及运营商可以在Android上打造,定制自己特有的手机操作系统,这势必在源码级别上对Android系统进行代码的添加和更改。如果不规范这些更改则会给上层的应用开放的移植带来问题(那个时候你会看到MOTO上跑的愤怒的小鸟会在三星的Android手机上运行不了,每个应用需要都要发布不同厂商的Android手机的版本),只有通过CTS测试的Android手机系统,Google才会颁发许可,以保证不同生产商之间的Android系统的兼容 |
dalvik | Android Dalvik虚拟机相关内容,主要是提供了一下工具,如dexdump, vm主代码已经移除 |
developers | 开发者目录, 一些应用程序的参考实例demo代码 |
development | 应用程序开发相关 提供应用开发的工具, 应用例子,monkey命令,shell脚本和python脚本:development/scripts/stack:用于展开进程异常时的堆栈信息, 配合tombstone文件development/scripts/gdbclient.py: 用于gdb调试development/scripts/native_heapdump_viewer.py脚本将dumpheap进程结果转换成更易读的html格式development/tools/make_keys: 系统签名生成器development/tools/idegen: 用于生成android.ipr、android.iml IEDA工程配置文件,可以用android studio来导入android源码 |
device | 设备相关配置 设备产品定制目录, 该目录是厂商和产品公司定制文件比较多的地方 |
vendor | 厂商定制目录,该目录可以新建出来 |
docs | 参考文档目录 |
external | 开源模组相关文件 外部第三方开源的库和工具,比如ppp, wpa_supplicant, libz, libcurl等 |
frameworks | 应用程序框架,Android系统核心部分,由Java和C++编写, 包括各种系统资源, 后台服务, SystemUI, 大部分都是java代码, 同时也包含了各种子系统的native代码, 如av, net等 |
hardware | 主要是硬件抽象层的代码, 如gps, wifi, viberate |
kernel | 内核源码,厂商可以将内核源码集成到该目录 |
libcore | 核心库相关文件 Android 系统中支持众多 Java 标准的库,例如 java.lang 包,libart库,JSON库 |
libnativehelper | 动态库,实现JNI库的基础 ,JNI编程时调用的各种接口实现代码, 如findClass(), 最终编译成libnativehelper.so |
ndk | NDK相关代码,帮助开发人员在应用程序中嵌入C/C++代码 |
out | 编译完成后代码输出在此目录 |
packages | 应用程序包,系统内置的app源码, 如设置, 墙纸,输入法,屏保等,apps:核心应用程序,inputmethods:输入法目录,providers:内容提供者目录,screensavers:屏幕保护,services:通信服务,wallpapers:墙纸 |
pdk | Platform Development Kit 的缩写,平台开发套件, PDK的目标是帮助芯片组供应商和原始设备制造商迁移到新的版本。在PDK推出之前,未能参与Google早期开发设备计划的OEM厂商和半导体供应商必须等到Android开源版本公布后,才能开始进行开发。而从Jelly Bean,也就是Android 4.1版本开始Google在发布新的Android版本之前会Release给与其签约过的OEM厂商和半导体供应商PDK(PDK的获取需要授权,因为PDK中的新版Android尚未正式发布),这样OEM厂商不会再落后于Google挑选的独家早期开发伙伴。PDK版本只包含开发android HAL(硬件抽象层)所必需的组件。请注意,完整的android版本是PDK版本的超集,并且没有单独的PDK发布给公众 |
platform_testing | Android平台测试程序 |
prebuilts | 预编译文件夹, x86和arm架构下预编译的一些资源,如ndk工具包, gcc编译器等 |
sdk | sdk和模拟器,编译sdk规则目录, Android的SDK包含该平台为应用程序开发人员提供的开发工具,主要是所有公开API的集合,应用程序开发人员可以借助SDK中的API快速的进行应用的开发. |
system | Android底层文件系统库、应用和组件,如busybox, init进程 |
test | Android Vendor测试框架,如vts(vendor test suit) ,Mainline Test Suite (MTS), mltsvts的概念: CTS确保保了 APP 与 Android Framework 之间有一致的调用接口(API),这使得 APP 开发者编写的同一款程序可以运行在不同系统版本(向前兼容)、不同硬件平台、不同厂商制造的不同设备上。 VTS 类似 CTS,通过对 Vendor Interface 进行测试,确保同一个版本的 Android Framework 可以运行在不同 HAL 上,或不同 Android Framework 可以运行在 同一个 HAL 上。 通过这样的 Framework / HAL 分离设计和接口一致性保证,也使得 8.0 版本之后的 Android 系统在进行升级时,可以直接对 Framework 进行升级而不用考虑 HAL 层的改动,从而缩短了用户手上设备得到系统升级 OTA 推送的时间Mainline Test Suite (MTS), MTS由一组测试框架和测试用例组成,旨在帮助增强主线分支代码的健壮性、可靠性和合规性。mlts是Android 机器学习测试套件 |
toolchain | 工具链文件,一些python测试脚本 |
tools | 工具文件,一些特殊命令, 如acloud命令用于连接谷歌云端工作站的,apkzlib用于apk打包的 |
Makefile | 全局Makefile文件,用来定义编译规则 |
表3
从表3可以看出,系统源码分类清晰,并且内容庞大且复杂。接下来分析packages中的内容,也就是应用层部分。
应用层部分
应用层位于整个Android系统的最上层,开发者开发的应用程序以及系统内置的应用程序都是在应用层。源码根目录中的packages目录对应着系统应用层。它的目录结构如表4所示。
packages目录 | 描述 |
---|---|
apps | 核心应用程序 |
experimental | 第三方应用程序 |
inputmethods | 输入法目录 |
providers | 内容提供者目录 |
screensavers | 屏幕保护 |
services | 通信服务 |
wallpapers | 墙纸 |
表4
从目录结构可以发现,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、VPN程序 |
sax | XML解析器 | services | 系统服务 |
telephony | 电话通讯管理 | test-runner | 测试工具相关 |
tests | 测试相关 | tools | 工具 |
wifi | wifi无线网络 |
表5
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++实现 |
表6讲完 C/C++程序库部分,剩下的部分我们在表3已经给出:Android运行时库的代码放在art/目录中。硬件抽象层的代码在hardware/目录中,这一部分是手机厂商改动最大的一部分,根据手机终端所采用的硬件平台会有不同的实现。
system目录
Android作为linux系统, 在构建最小系统时,需要祖先init进程, 依赖库,二进制工具linux命令,以及各种守护进程等, system目录就提供了这些东西,该目录大部分都是C/C++代码
目录位置 | 描述 |
---|---|
apex | apexd守护进程源码,负责处理apex安装包的。 |
ashmemd | |
bpf | |
bpfprogs | |
bt | Android bluedroid协议栈 |
ca-certificates | |
chre | Context Hub Runtime Environment (CHRE),用于平衡大小核运行不同程序的场景, 提供api,保证小型的本机应用程序(称为nanoapps )在低功耗处理器上执行 |
connectivity | 包含wificond进程,该进程通过标准 nl80211命令与WLAN 驱动程序进行通信 |
core | 包含各种依赖库,adb,祖先init进程源码,lmkd,logcat, toolbox |
extras | 各种额外的命令工具, 比如su,memtrack(追踪graphic相关内存),playwav命令,以及一些测试代码 |
gatekeeper | 防护程序,如锁屏密码等 |
gsid | 通用系统镜像守护进程 |
hardware | 网络相关的HIDL描述文件 |
hwservicemanager | HAL服务管理中心,负责管理系统中的所有HAL服务,由init进程启动,属于vendor的binder通信机制,类似framework中的binder |
iorap | IOrap用于缩短应用程序的启动时间,该目录包含iorapd守护进程和相应的库文件 |
keymaster | |
libfmq | |
libhidl | 硬件接口定义语言依赖库 |
libhwbinder | hwbinder依赖库 |
libsysprop | sysprop说明文件 (.sysprop) 将系统属性定义为 API, 在java/c++代码中可以通过api访问跨分区的属性,类似以前android版本中的SystemProperties |
libufdt | |
libvintf | |
linkerconfig | |
media | 包括alsa、audio、camera相关的头文件 |
netd | Android中专门负责网络管理和控制的后台守护进程,如管理DNS,设置防火墙,带宽控制 |
nfc | |
nvram | |
security | |
sepolicy | selinux权限策略配置目录 |
server_configurable_flags | |
testing | |
timezone | |
tools | aidl,hidl可执行程序的源码路径 |
ucontainer | |
update_engine | 负责A/B升级的核心逻辑代码 |
vold | Volume守护进程,用来管理Android中存储类的热拔插事件,如设备增加,删除,修改等事件处理 |
framework目录
目录位置 | 描述 |
---|---|
av | audio/video, 如音视频解码器,录屏工具, 摄像头框架相关代码, 多媒体框架供上层程序调用的java API,连接java和C/C++的jni部分, 在framework/base/media 下 |
base | 基础核心代码 |
compile | 包含libbcc,mclinker(llvm编译器的插件) slang(Renderscript语言的编译器) |
ex | Android内部使用的公共类,如联系人、小部件、io, 以及全新的相机框架 Camera2的部分代码 |
hardware | 描述传感器,虚拟现实VR,camera等硬件的HIDL接口的文件.hal |
layoutlib | 布局相关 |
minikin | Android原生字体,连体字效果 |
ml | 机器视觉 |
multidex | 多dex加载器,大多数App,解压其apk后,一般只有一个classes.dex文件,采用MultiDex的App解压后可以看到有classes.dex,classes2.dex,… classes(N).dex |
native | c/c++本地语言编写的相关工具源码和特定硬件控制的头文件,如 bugreport, dumpstate, 各种硬件的访问权限声明 |
opt | 一些UI插件和java后台服务,如timezonepicker,datetimepicker, colorpicker, 网络服务,如EthernetService, WifiService, 电话服务telephony |
rs | 渲染脚本rendor script |
wilhelm | 基于Khronos的OpenSL ES/OpenMAX AL的audio/multimedia实现 |
framework/av/ 下
目录位置 | 描述 |
---|---|
aidl | |
apex | |
camera | libcamera_client共享库,是camera框架部分的client代码 |
cmds | 包括录屏工具,stagefright进程 |
drm | |
include | |
media | 提供音视频编解码的各种库和工具,后台进程如audioserver, mediaserver(通过binder的进程间通信方式来完成其他进程(如音乐播放器)的请求) |
services | 多媒体相关的后台服务, 如cameraservice,audioflinger |
MODULE_LICENSE_APACHE2 | |
CleanSpec.mk | |
NOTICE | |
OWNERS | |
soundtrigger | |
tools |
framework/base/ 下
其中base目录中是应用框架层的主要核心代码,目录结构如下
目录位置 | 描述 |
---|---|
apct-tests | |
apex | |
api | 声明了android应用框架层的类、属性和资源 |
boot | |
cmds | 开机启动的进程代码和命令(脚本), 著名的zygote进程代码和启动动画代码就在此处 |
config | |
core/java | Android应用开发锁依赖的各种包, 四大组件代码就在此,如android/app/Activity.java,android/app/Service.java,android/content/ContentProvider.java,/android/content/BroadcastReceiver.java |
core/jni | 服务于android系统java核心代码所需要的jni,被编译成libandroid_runtime.so |
core/res | 系统中所需要的各种资源, 图片,字符串,尺寸,布局文件等 |
core/proto | |
core/tests | |
core/xsd | |
data | 系统默认的铃声,字体, 根文件系统etc目录部分配置文件,触摸需要的kl, kcm文件等 |
docs | |
drm | Digital Rights Management(数字版权管理) ,应用根据与受版权保护的内容关联的许可限制来管理自己的内容,从而达到保护应用内容的知识产权 |
errorprone | |
graphic | 为应用提供的android.graphics包,提供基本的图形原语(如画点画线,设置图形上下文等)另外和图形相关的包:android.view图形事件机制和android.widget包提供开发图形用户界面的控件 |
identity | |
keystore | 提供android.security.keystore包, 应用可以通过KeyStore API生成密钥、使用密钥签名, keystorek可以保护密钥材料免遭未经授权的使用 |
libs | 大部分都是c/c++代码,编译成so, 如Canvas 的drawing 操作转换为OpenGL 的操作的libhwui.so |
location | 定位相关接口,被App调用的,API包是android.location |
lowpan | 提供android.net.lowpan报,提供基于IPv6的低速无线个域网的API, lowpan功能与Zigbee类似 |
media | 多媒体相关接口,被App调用的, 包含MediaPlayer代码 |
mime | |
mms | |
native | 部分硬件相关的jni库:如sensor, net, 存储管理, 最后合并在libandroid.so中 |
nfc-extras | |
obex | 蓝牙文件传输obex协议 |
omapi | |
opengl | 提供android.opengl包, 提供android 2D/3D图形处理各种API |
packages | 著名的SystemUI,彩蛋,锁屏,SettingProvider(系统设置数据提供者) |
proto | |
rs | 提供android.renderscript 包,RenderScript 是Android 平台上的一种类C脚本语言,用于渲染绘图 |
samples | |
sax | |
services | android开机启动的大部分后台服务,如PMS, AMS, WMS等 |
startop | |
telecomm | |
telephony | 电话相关 |
test-base | |
test-legacy | |
test-mock | |
test-runner | |
tests | |
tools | 提供应用开发的各种工具和脚本:如aapt |
wifi | 提供android.net.wifi包,如wifi扫描, p2p,hotspot2相关API |
libcore目录
libcore 提供Android 系统中支持众多 Java 标准的库,例如 java.lang 包
目录位置 | 描述 |
---|---|
luni | Java 基础包、扩展包、组织提供的类库等,luni 实际上是 lang、util、net、io 这 4 个内容头字母的组合,通过文件luni/src/module/java/module-info.java可以导出的所有类 |
libart | art 运行时部分相关包 |
dalvik | dalvik 虚拟机相关的包 |
dom | 文档对象模型,用于解析xml |
json | json 串在 Java 中的支持 |
xml | 一种轻量级的xml解析工具 |
ojluni | Open JDK 版的 Java 包,android7.0之后就开始用这个开源的java api |
未完待续…