一、AOSP 到底是什么?
说实话,我刚入行那会儿,也以为 AOSP 就是「Android 的源代码」。后来踩了坑才明白——AOSP 的全称是 Android Open Source Project,它不只是一堆代码,而是一整套完整的移动操作系统框架。
你可以把它理解成「毛坯房」。Google 把地基、承重墙、水电管线都给你铺好了。你拿到手之后,可以刷大白墙直接住人(比如 Pixel 手机),也可以敲掉几面墙重新装修(比如小米的 MIUI、华为的 EMUI)。
核心定义:AOSP 是 Google 主导的开源移动操作系统项目,遵循 Apache 2.0 许可证。任何人可以免费获取、修改、分发。
1.1 我为什么说它「不止是代码」?
我在 2016 年参与过一个车载 Android 项目。当时团队里有人直接拿 AOSP 源码编译刷机,结果触摸屏驱动死活点不亮。折腾了两天,最后发现是内核里的 Input 子系统配置不对。
这个教训让我意识到:AOSP 是一个分层架构。你只改上层应用,不动底层驱动,照样可能翻车。
二、AOSP 的架构全景
先上一张我手绘的架构图。这张图我每次培训都会画,因为它能帮你一眼看透 Android 的「骨架」。
2.1 从上往下拆解
这张图我建议你存下来。每次遇到问题,先定位问题出在哪一层。
- 应用层:你手机上能看到的所有 App。包括系统预装的拨号器、短信,以及你从商店下载的微信、抖音。
- 应用框架层:这是 Android 给开发者提供的「工具箱」。比如你想让 App 弹出一个窗口,调用的就是 Window Manager 的 API。
- 系统运行库 + ART:左边是 C/C++ 写的底层库(比如处理视频解码的 Media Framework),右边是 Java 虚拟机 ART。App 的代码最终在 ART 里跑。
- 硬件抽象层 (HAL):这一层是「翻译官」。上层说「我要拍照」,HAL 把它翻译成摄像头驱动能听懂的命令。
- Linux 内核:真正的「大管家」。管理进程、内存、网络、驱动。没有它,上面全是空中楼阁。
我的经验:做 ROM 定制时,90% 的兼容性问题出在 HAL 层。比如某款国产传感器,HAL 接口实现不规范,上层 App 拿到的数据全是乱的。我曾经花了一周时间,硬着头皮读传感器厂商的 HAL 源码才找到 bug。
三、版本演进:从 Cupcake 到 Upside Down Cake
Android 的版本代号很有意思,全是甜点。从 1.5 的 Cupcake(纸杯蛋糕)到 14 的 Upside Down Cake(倒扣蛋糕)。
但说实话,对我们做底层开发的人来说,真正重要的不是名字,而是架构层面的变化。
3.1 几个关键转折点
| 版本 | 代号 | 对我影响最大的变化 |
|---|---|---|
| Android 1.5 | Cupcake | 首次引入虚拟键盘、AOSP 正式开源 |
| Android 4.0 | Ice Cream Sandwich | 统一手机和平板 UI,HAL 层开始标准化 |
| Android 5.0 | Lollipop | ART 取代 Dalvik,性能提升明显。我当年升级时,App 启动速度肉眼可见地快了 |
| Android 8.0 | Oreo | Project Treble 引入,HAL 和内核解耦。这是我个人最感激的一个版本——终于不用每次升级系统都重写驱动了 |
| Android 10 | Q | 强制要求 Treble 支持,分区布局大改 |
| Android 12+ | Snow Cone 等 | Material You 设计语言,隐私保护大幅加强 |
3.2 Project Treble 为什么重要?
在 Android 8.0 之前,厂商要升级系统版本,必须连内核驱动一起改。这就导致很多手机厂商「懒得升级」——改驱动太费劲了,不如直接出新品。
Treble 把 HAL 接口固定下来,厂商只需要维护一份 HAL 实现,上层系统随便升级。嗯,这个设计思路,说白了就是「面向接口编程」在系统级的应用。
避坑指南:我曾经接手过一个 Android 7.1 的项目,客户要求升级到 9.0。因为没有 Treble,HAL 接口全变了,摄像头、音频、传感器驱动全部重写。最后工期超了 3 个月。所以,如果你现在还在维护 Android 8.0 之前的设备,尽早规划 Treble 迁移。
四、AOSP 源码目录结构
下载完 AOSP 源码后,你会看到这样的目录布局。我挑几个最常用的说说:
aosp/
├── art/ # ART 运行时
├── bionic/ # C 标准库实现
├── build/ # 编译系统 (Soong, Make)
├── device/ # 设备相关配置
├── frameworks/ # 应用框架层核心代码
│ ├── base/ # 核心框架 (Activity, Window, View)
│ └── native/ # 原生服务 (SurfaceFlinger, AudioFlinger)
├── hardware/ # HAL 接口定义与实现
├── kernel/ # Linux 内核 (通常单独仓库)
├── packages/ # 系统应用 (Launcher, Settings, Dialer)
├── system/ # 系统核心组件 (init, adb, logd)
├── vendor/ # 厂商私有代码 (驱动, 库)
└── external/ # 第三方开源库 (sqlite, curl, libpng)
我个人最常待的两个目录是 hardware/ 和 device/。做 ROM 定制时,90% 的修改都集中在这里。
小技巧:如果你只是想了解 AOSP 的编译流程,不用下载全部源码。用 repo init -b <分支> --depth=1 只拉取最新代码,能省下几十 GB 的磁盘空间。
五、总结
这一章我们聊了 AOSP 的定义、五层架构、版本演进的关键节点,以及源码目录的布局。说白了,AOSP 就是一个「巨人的肩膀」——Google 把最复杂的底层基础设施搭好了,我们这些做嵌入式 Android 的人,只需要关注怎么在上面盖出适合自己的房子。
下一章,我会带你亲手搭建 AOSP 的编译环境,从零开始编译出第一个系统镜像。到时候你会发现,原来「定制 ROM」这件事,并没有想象中那么神秘。