首语
由于工作内容的转变,使得我向Android系统方向转变,对于一个Android系统工程师,了解Android整个系统架构是必然的。本篇是Android系统学习的开篇,Android系统庞大且复杂,但是能对Android的认识更深,更全面。开启Android系统之旅吧!
推荐Android系统干货博主:Gityuan
系统架构
Android系统架构分为五层。从上往下依次是应用层 、应用框架层 、系统运行库层 、硬件抽象层 和Linux内核层。
应用层(System Apps)
系统内置的应用程序以及非系统级的应用程序都属于应用层,负责与用户进行直接交互。
应用框架层(Java API Framework)
应用框架层为开发人员提供了开发应用程序所需要的API,我们平成开发应用程序都是调用这一层提供的API,当然也包括系统应用。这一层是由Java代码编写的,可以称为Java Framework。
它所提供的组件如下:
名称 | 功能描述 |
---|---|
Activity Manager(活动管理器) | 管理各个应用程序生命周期,以及常用的导航回退功能 |
Location Manager(位置管理器) | 提供地理位置及定位功能服务 |
Package Manager(包管理器) | 管理所有安装在Android系统的应用程序 |
Notification Manager(通知管理器) | 使得应用程序在通知栏显示自定义的提示消息 |
Resource Manager(资源管理器) | 提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等 |
Telephony Manager(电话管理器) | 管理所有的移动设备功能 |
Window Manager(窗口管理器) | 管理所有的窗口程序 |
Content Provider(内容提供者) | Android四大组件之一。使得不同应用程序之间共享数据 |
View System(视图系统) | 构建应用程序的基本组件 |
系统运行库层(Native)
从上图可以看出,系统运行库层分为两部分,分别是C/C++程序库和Android运行时库。
C/C++程序库
C/C++库被Android系统中的不同组件使用,并通过应用程序框架为开发者提供服务。以下为主要的C/C++程序库:
名称 | 功能描述 |
---|---|
OpenGL ES | 3D 绘图函数库 |
Libc | 从BSD继承来的标准C系统函数库,专门为嵌入式Linux的设备定制 |
Media Framework | 多媒体库,支持多种常用的音频、视频格式录制和回放 |
SQLite | 轻型的关系型数据引擎 |
SGL | 底层的2D图形渲染引擎 |
SSL | 安全套接层,是一种为网络通信提供安全及数据完整性的安全协议 |
Free Type | 可移植的字体引擎,提供统一的接口来访问多种字体格式文件 |
Webkit | 浏览器网页排版引擎,包含WebCore排版引擎和JSCore引擎。 |
OpenMax AL | OpenMax是一个多媒体应用程序的框架标准,OpenMax分为3层: 第一层:OpenMax DL(Development Layer,开发层) 第二层:OpenMax IL(Integration Layer,集成层) 第三层:OpenMax AL(Appliction Layer,应用层) |
Android运行时库
从上图可以看出,运行时库分为核心库和ART。
核心库
核心库提供了Java语言核心库的大多数功能,开发者使用Java语言编写应用程序。
ART
Android 5.0后,Dalvik虚拟机被ART取代。与JVM相比,Dalvik虚拟机(DVM)是专门为移动设备定制的,允许在有限的内存同时运行多个虚拟机的实例,并且每一个Dalvik应用作为一个独立的Linux进程执行。这样可以防止虚拟机崩溃的时候所有程序都关闭。ART与DVM的机制有所不同,DVM中的应用每次运行时,字节码都需要通过即时编译器(JIT)转化为机器码,使得应用程序运行效率降低。在ART中,系统安装应用时会进行依次预编译(AOT),将字节码预先编译成机器码并存储在本地,这样不需要每次运行执行编译,提高运行效率。
硬件抽象层(HAL)
硬件抽象层是位于操作系统内核与硬件电路之间的接口层,目的在于将硬件抽象化。为了保护硬件厂商的知识产权,它隐藏了特定平台的硬件接口细节,为操作系统提供虚拟硬件平台,使其具有硬件无关性,可在多种平台上进行移植。从软硬件测试的角度来看,软硬件的测试工作都可分别基于硬件抽象层来完成,使得软硬件测试工作的并行进行成为可能。通俗来讲,就是将控制硬件的动作放在硬件抽象层中。
Linux内核层(Linux Kernel)
Android的核心服务基于Linux内核层,这一层为android设备的各种硬件提供了底层的强大驱动,如显示驱动、音频驱动、照相机驱动、蓝牙驱动、Wi-Fi驱动、电源管理等。在此基础上添加了部分Android专用的驱动,如Binder、Alarm、Logger等。系统的安全性、内存管理、进程管理、网络协议栈和驱动模型都依赖该内核。
Android版本
版本号 | 代号 | API |
---|---|---|
Android 14.0 | U | 34 |
Android 13.0 | T | 33 |
Android 12.0L | S | 32 |
Android 12.0 | S | 31 |
Android 11.0 | R | 30 |
Android 10.0 | Q | 29 |
Android 9.0 | Pie | 28 |
Android 8.1 | Oreo | 27 |
Android 8.0 | Oreo | 26 |
Android 7.1.1 | Nougat | 25 |
Android 7.0 | Nougat | 24 |
Android 6.0 | Marshmallow | 23 |
Android 5.1 | Lollipop | 22 |
Android 5.0 | Lollipop | 21 |
Android 4.4W | KitKat Wear | 20 |
Android 4.4 | KitKat | 19 |
Android 4.3 | Jelly Bean | 18 |
Android 4.2 | Jelly Bean | 17 |
Android 4.1 | Jelly Bean | 16 |
Android 4.0.3 | IceCreamSandwich | 15 |
Android 4.0 | IceCreamSandwich | 14 |
Android 3.2 | Honeycomb | 13 |
Android 3.1 | Honeycomb | 12 |
Android 3.0 | Honeycomb | 11 |
Android 2.3.3 | Gingerbread | 10 |
Android 2.3 | Gingerbread | 9 |
Android 2.2 | Froyo | 8 |
Android 2.1 | Eclair | 7 |
系统源码目录
关于Android源码下载,可以参考:Windows下安装Ubuntu、图形界面、下载Android源码,看这一篇就够了
目录基于Android13。
整体结构
源码根目录 | 描述 |
---|---|
art | ART运行环境 |
bionic | 系统C库 |
bootable | 启动引导相关代码 |
build | 系统编译规则及generic等基础开发包配置 |
cts | Android 兼容性测试套件标准 |
dalvik | Dalvik 虚拟机 |
developers | 开发者目录 |
development | 应用程序相关 |
device | 设备相关配置 |
docs | 参考文档 |
external | 开源模组相关 |
frameworks | 应用程序框架,Android系统核心部分 |
hardware | 硬件抽象层代码 |
kernel | 内核层,包括设备驱动、硬件抽象层、系统调用等方面的代码 |
libcore | 核心库相关文件 |
libnativehelper | 动态库,实现JNI库的基础 |
packages | 应用程序包 |
out | 编译代码输出目录,可自定义 |
pdk | Plug Development Kit,本地开发套件 |
platform_testing | 平台测试 |
prebuilts | X86和ARM架构下预编译的一些资源 |
sdk | SDK和模拟器 |
system | 底层文件系统库、应用和组件 |
test | 存放测试代码和测试工具 |
toolchain | 工具链文件 |
tools | 工具文件 |
还有一个重要的目录vendor,存放厂商定制代码。
应用层(packages)
应用层是Android系统的最上层,开发者开发的应用和系统内置的应用都在应用层。源码根目录中的packages目录对应着系统应用层。
packages目录 | 描述 |
---|---|
apps | 核心应用程序 |
modules | 独立、可插拔的应用程序模块 |
inputmethods | 输入法目录 |
providers | 内容提供者目录 |
screensavers | 屏幕保护 |
services | 通信服务 |
wallpapers | 壁纸 |
应用框架层(frameworks/base)
应用框架层是系统的核心部分,向上提供接口给应用层调用,向下与C/C++程序库及硬件抽象层进行通信,主要实现代码在frameworks/base和frameworks/av这两个目录下,frameworks的目录结构如下:
frameworks/base目录 | 描述 |
---|---|
apct_tests | 存放自动化测试相关代码及测试用例 |
apex | APEX(Android Package Executable)模块,一种新的Android应用打包格式,用于将系统组件和服务以及供应商组件和服务封装为单独的模块 |
api | 定义API |
boot | 操作系统的启动代码和基本类库 |
cmds | 重要命令,如am、app_proce等 |
config | 系统的配置文件和数据结构 |
core | 核心库 |
data | 字体、声音等数据文件 |
docs | 文档 |
drm | 数字版权管理(DRM)的代码和类库 |
errorprone | 错误处理和异常处理的代码和类库 |
graphics | 图形图像有关 |
identity | 身份验证和授权的代码和类库 |
keystore | 数据签名证书相关 |
libs | 库 |
location | 地理位置相关库 |
media | 多媒体相关库 |
mime | MIME(多用途互联网邮件扩展)类型的定义和配置信息 |
mms | 短信和多媒体消息服务的代码和类库 |
native | 本地库 |
nfc-extras | NFC相关 |
obex | 蓝牙传输 |
omapi | OMADP(Open Mobile Alliance Device Provider)的API接口和类库 |
opengl | 2D/3D图形API |
packages | 设置、TTS、SystemUI、VPN程序等 |
proto | 系统中的各种协议和数据结构的定义和配置信息 |
rs | RenderScript(渲染脚本)的代码和类库 |
samples | 各种示例代码和演示程序 |
sax | xml解析器 |
services | 系统服务 |
startop | StartOp(启动操作)的代码和类库 |
telecom | Telecom(电话通信)的代码和类库 |
telephony | 电话通信管理 |
test-runner | 测试工具相关 |
tests | 与测试相关 |
tools | 工具 |
wifi | Wi-Fi 无线网络 |
C/C++程序库部分
系统运行库层的C/C++程序库的类型繁多,功能强大。以下是比较常用且重要的C/C++程序库。
目录位置 | 描述 |
---|---|
bionic | Google开发的系统C库,以BSD许可形式开源 |
frameworks/av/media | 系统媒体库 |
frameworks/native/opengl | 第三方图形渲染库 |
frameworks/native/services/surfaceflinger | 图形显示库,负责图形渲染、叠加和绘制功能 |
external/sqlite | 轻量级关系型数据库SQLite的C++实现 |
源码阅读
源码阅读有在线阅读和本地阅读两种方式。在线阅读推荐官方:https://cs.android.com
本地阅读就是将代码下载到本地,然后通过Android Studio去阅读。以下是阅读环境配置:
1.更改内存设置,把内存调整到8GB及以上
2.在源码根目录,编译idegen模块
shell
source build/envsetup.sh
mmm development/tools/idegen/
编译成功后在 /out/host/linux-x86/framework
目录下会生成 idegen.jar
文件。
3.执行sh脚本,它将使用这个jar生成所需的 .ipr
文件:
shell
development/tools/idegen/idegen.sh
成功后,源码根目录可以找到 android.iml
和 android.ipr
两个文件,用Android Studio打开 android.ipr
文件即可,等待一段时间的扫描就可以了。
总结
以上都是学习Android系统源码的必备基础,掌握它们才能更好的深入学习Android系统源码,如有问题欢迎批评指正。后续会学习Android系统启动、AMS、WMS等源码,真正走进Android系统源码的世界。