一直想写个Android Framework的系列文章,就先按照以下计划慢慢来,基于Android 10源码
- Android系统架构详解
- Android系统源码目录结构详解
- AOSP编译流程详解
- Android系统启动流程
- App启动流程
- Binder详解
- ActivityManagerService详解
- WindowManagerService详解
- SystemUI详解
- Launcher详解
- Android系统优化专题
Android 系统源码里编程语言主要有以下几种:
- 汇编:bootloader和kernel中可能会用到
- C语言:这你丫不会,你玩毛的Linux Kenel啊
- C++:这你丫不会,你就别搞Android底层开发了,HAL和中间库
- Java:这么再不会就自杀吧,framework和app的代码都是Java的
- Python:这个不会么也没事,编译相关的
- Shell:这个不会么也没事,脚本相关的
- Makefile:会C++的肯定知道这个
Android开放源代码 --> AOSP
Android 系统架构
Android的架构是分层的,非常清晰,分工很明确。 Android本身是一套软件堆叠(Software Stack),或称为「软件叠层架构」, 叠层主要分成三层:操作系统、中间件、应用程序。 Android系统分为4层,包括:
Android 8 之前的系统架构
Android 8 以后的系统架构
- 应用框架。应用框架最常被应用开发者使用。作为硬件开发者,您应该非常了解开发者 API,因为很多此类 API 都可以直接映射到底层 HAL 接口,并可提供与实现驱动程序相关的实用信息。
- Binder IPC。Binder 进程间通信 (IPC) 机制允许应用框架跨越进程边界并调用 Android 系统服务代码,这使得高级框架 API 能与 Android 系统服务进行交互。在应用框架级别,开发者无法看到此类通信的过程,但一切似乎都在“按部就班地运行”。
- 系统服务。系统服务是专注于特定功能的模块化组件,例如窗口管理器、搜索服务或通知管理器。应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件。Android 包含两组服务:“系统”(诸如窗口管理器和通知管理器之类的服务)和“媒体”(与播放和录制媒体相关的服务)。****
- 硬件抽象层 (HAL) 。HAL 可定义一个标准接口以供硬件供应商实现,这可让 Android 忽略较低级别的驱动程序实现。借助 HAL,您可以顺利实现相关功能,而不会影响或更改更高级别的系统。HAL 实现会被封装成模块,并会由 Android 系统适时地加载。如需了解详情,请参阅硬件抽象层 (HAL)。
- Linux 内核。开发设备驱动程序与开发典型的 Linux 设备驱动程序类似。Android 使用的 Linux 内核版本包含一些特殊的补充功能,例如低内存终止守护进程(一个内存管理系统,可更主动地保留内存)、唤醒锁定(一种
PowerManager
系统服务)、Binder IPC 驱动程序,以及对移动嵌入式平台来说非常重要的其他功能。这些补充功能主要用于增强系统功能,不会影响驱动程序开发。您可以使用任意版本的内核,只要它支持所需功能(如 Binder 驱动程序)即可。不过,我们建议您使用 Android 内核的最新版本。如需了解详情,请参阅构建内核一文。
两者区别
Android 8.0 重新设计了 Android 操作系统框架(在一个名为“Treble”的项目中),以便让制造商能够以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。在这种新架构中,HAL 接口定义语言(HIDL,发音为“hide-l”)指定了 HAL 和其用户之间的接口,让用户能够替换 Android 框架,而无需重新编译 HAL。
利用新的供应商接口,HIDL 将供应商实现(由芯片制造商编写的设备专属底层软件)与 Android 操作系统框架分离开来。供应商或 SOC 制造商构建一次 HAL,并将其放置在设备的 /vendor 分区中;框架可以在自己的分区中通过无线下载 (OTA) 更新进行替换,而无需重新编译 HAL。
旧版 Android 架构与当前基于 HIDL 的架构的区别在于对供应商接口的使用
- Android 8.0之前
Android 7.x 及更早版本中没有正式的供应商接口,因此设备制造商必须更新大量 Android 代码才能将设备更新到新版 Android 系统,如下图
- Android 8.0之后
Android 8.0 及更高版本提供了一个稳定的新供应商接口,因此设备制造商可以访问 Android 代码中特定于硬件的部分,这样一来,设备制造商只需更新 Android 操作系统框架,即可跳过芯片制造商直接提供新的 Android 版本,如下图
所有搭载 Android 8.0 及更高版本的新设备都可以利用这种新架构。为了确保供应商实现的前向兼容性,供应商接口会由供应商测试套件 (VTS) 进行验证,该套件类似于兼容性测试套件 (CTS)。您可以使用 VTS 在旧版 Android 架构和当前 Android 架构中自动执行 HAL 和操作系统内核测试。
Linux内核
Android的核心系统服务依赖于Linux内核,如
- 安全性
- 内存管理
- 进程管理
- 网络协议栈
- 驱动模型
Linux 内核也同时作为硬件和软件栈之间的抽象层
驱动:
- 显示驱动(Display Driver)
- 摄像头驱动(Camera Driver)
- 键盘驱动(Keypad Driver)
- 蓝牙驱动(Bluetooth Driver)
- WiFi驱动(WIFI Driver)
- Audio驱动(Audio Driver)
- Binder(IPC)驱动
- 电源管理(Power Manager)
- M-Systems驱动
系统库(Libraries)
Android包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库:
- 界面管理(Surface Manager)
- 多媒体框架(Media Framework)
- SQLite
- 字体引擎(FreeType)
- 图形处理3D库(OpenGL|ES)
- SGL
- 浏览器(WebKit)
- 安全套接层(SSL)
- C库
Android运行环境(Android Runtime)
- Core Libraries
- Dalvik Virtual Machine
Core Libraries 提供大部分在Java编程语言核心类库中可用的功能
Dalvik Virtual Machine,每一个Android应用程序是Dalvik虚拟机中的实例,运行在他们自己 的进程中。Dalvik虚拟机设计成,在一个设备可以高效地运行多个虚拟机。Dalvik虚拟机可执行文件格式是.dex,dex格式是专为Dalvik 设计的一种压缩格式,适合内存和处理器速度有限的系统。大多数虚拟机包括JVM都是基于栈的,而Dalvik虚拟机则是基于寄存器的。 两种架构各有优劣,一般而言,基于栈的机器需要更多指令,而基于寄存器的机器指令更大。dx 是一套工具,可以將 Java .class 转换成 .dex 格式。一个dex文件通常会有多个.class。由于dex有時必须进行最佳化,会使文件大小增加1-4倍,以ODEX结尾。Dalvik虚拟机依赖于Linux 内核提供基本功能,如线程和底层内存管理。
应用程序框架层(Application Framework)
Android的应用程序框架为应用程序层的开发者提供APIs,它实际上是一个应用程序的框架,应用程序的体系结构旨在简化组件的重用,任何应用程序都能发布他的功能且任何其他应用程序可以使用这些功能(需要服从框架执行的安全限制)。这一机制允许用户替换组件。。由于上层的应用程序是以JAVA构建的,因此本层次提供的首先包含了UI程序中所需要的各种控件:例如: Views (视图组件)包括 lists(列表), grids(栅格), text boxes(文本框), buttons(按钮)等。甚至一个嵌入式的Web浏览器。
- [活动管理器(Activity Manager Services)](\framework\ActivityManager.md)
- [窗口管理器(Window Manager Services)]()
- [内容提供者(Content Providers)]()
- [视图系统(View Systems)]()
- [通知管理器(Notification Manager)]()
- [包管理器(Package Manager)]()
- [电话管理器(Telephony Manager)]()
- [资源管理器(Resource Manager)]()
- [定位管理层(Location Manager)]()
- [XMPP Service]()
系统服务
SystemServer 是framework中非常重要的一个进程,它是在虚拟机启动后运行的第一个java进程,SystemServer启动其他系统服务,这些系统服务都是以一个线程的方式存在于SystemServer进程中。
- EntropyService 提供伪随机数
- PowerManagerService 电源管理服务
- ActivityManagerService 最核心的服务之一,管理Activity
- TelephonyRegistry 通过该服务注册电话模块的事件响应,比如重启、关闭、启动等
- PackageManagerService 程序包管理服务
- AccountManagerService 账户管理服务,是指联系人账户,而不是Linux系统的账户
- ContentService ContentProvider服务,提供跨进程数据交换
- BatteryService 电池管理服务
- LightsService 自然光强度感应传感器服务
- VibratorService 震动器服务
- AlarmManagerService 定时器管理服务,提供定时提醒服务
- WindowManagerService Framework最核心的服务之一,负责窗口管理
- BluetoothService 蓝牙服务
- DevicePolicyManagerService 提供一些系统级别的设置及属性
- StatusBarManagerService 状态栏管理服务
- ClipboardService 系统剪切板服务
- InputMethodManagerService 输入法管理服务
- NetStatService 网络状态服务
- NetworkManagementService 网络管理服务
- ConnectivityService 网络连接管理服务
- AccessibilityManagerService 辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果
- MountService 挂载服务,可通过该服务调用Linux层面的mount程序
- NotificationManagerService 通知栏管理服务,Android中的通知栏和状态栏在一起,只是界面上前者在左边,后者在右边
- DeviceStorageMonitorService 磁盘空间状态检测服务
- LocationManagerService 地理位置服务
- SearchManagerService 搜索管理服务
- DropBoxManagerService 通过该服务访问Linux层面的Dropbox程序
- WallpaperManagerService 墙纸管理服务,墙纸不等同于桌面背景,在View系统内部,墙纸可以作为任何窗口的背景
- AudioService 音频管理服务
- BackupManagerService 系统备份服务
- AppWidgetService Widget服务
- RecognitionManagerService 身份识别服务
- DiskStatsService 磁盘统计服务
核心服务
-
ActivityManagerService
-
WindowManagerService
-
Android Graphics系统
- Surfaceflinger
- PackageManagerService
- Input系统
系统应用
- System UI
- Launcher
应用程序层
Android的应用程序主要是用户界面(User Interface)方面的,通常以JAVA程序编写,其中还可以包含各种资源文件(放置在res目录中)JAVA程序及相关资源经过编译后,将生成一个APK包。 Android本身提供了主屏幕(Home),联系人(Contact),电话(Phone),浏览器(Browers)等众多的核心应用。 同时应用程序的开发者还可以使用应用程序框架层的API实现自己的程序。这也是Android开源的巨大潜力的体现。
Android系统相关扫盲
HIDL
HIDL 读作 hide-l,全称是 Hardware Interface Definition Language。它在 Android Project Treble 中被起草,在 Android 8.0 中被全面使用,其诞生目的是使 Android 可以在不重新编译 HAL 的情况下对 Framework 进行 OTA 升级
使用 HIDL 描述的 HAL 描述文件替换旧的用头文件描述的 HAL 文件的过程称为 * HAL 的 binder 化(binderization)。所有运行 Android O 的设备都必须只支持 binder 化后的 HAL 模块。 已发布的 HIDL package包位于 Android 代码库的hardware/interfaces/或vendor/vendorName目录下。使用 HDIL 描述的 HAL 接口存放在这些目录下的.hal文件中。比如我们可以在hardware/interfaces/audio/2.0/目录下找到部分 Audio HAL 描述文件
HIDL:HIDL 是用于指定 HAL 与其用户之间接口的一个接口描述语言(Interface Description Language),它允许将指定的类型与函数调用收集到接口(Interface)和包(Package)中。更广泛地说,HIDL 是一个可以让那些独立编译的代码库(Libraries)之间进行通信的系统。 HIDL 实际上是用于进行进程间通信(Inter-process Communication,IPC)的。进程间的通信可以称为 Binder 化(Binderized)。对于必须连接到进程的库,也可以使用 passthough 模式(但在Java中不支持)。 HIDL 将指定的数据结构与方法签名组织到接口中,这些接口又会被收集到包中以供使用。它的语法与 C++、JAVA 是类似的,不过关键字集合不尽相同。其注释风格与 JAVA 是一致的。 AIDL: 接口定义语言,在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。
.bp
Android.bp是用来替换Android.mk的配置文件,它使用Blueprint框架来解析。Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。
.rc
Soong
Android BSP
Android BSP, 基本可以理解为:
- linux 驱动
- linux BSP (CPU,电源管理比驱动更深入的硬件支持包)
- Android HAL层
首先,熟悉linux kernel,linux driver的基本架构,熟悉C语言,懂得基本硬件知识,能看懂电路图。 其次,要熟悉linux系统编程,因为很多HAL层或者一些硬件的适配需要编写应用层软件来适配,尤其是Android定制性比较高。 再次,需要了解构建Android环境需要的知识,如makefile,打包,烧写等知识。
Other
- adb命令
- Handler
- Activity启动流程
- Binder机制
- AIDL原理
- Android图像显示相关流程,VSync信号,SurfaceFlinger到FrameBuffer
- App启动模式