首语
由于工作内容的转变,使得我向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模块
source build/envsetup.sh
mmm development/tools/idegen/
编译成功后在 /out/host/linux-x86/framework 目录下会生成 idegen.jar 文件。
3.执行sh脚本,它将使用这个jar生成所需的 .ipr 文件:
development/tools/idegen/idegen.sh
成功后,源码根目录可以找到 android.iml 和 android.ipr 两个文件,用Android Studio打开 android.ipr文件即可,等待一段时间的扫描就可以了。
总结
以上都是学习Android系统源码的必备基础,掌握它们才能更好的深入学习Android系统源码,如有问题欢迎批评指正。后续会学习Android系统启动、AMS、WMS等源码,真正走进Android系统源码的世界。


















