一、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 的「骨架」。

应用层 (Applications) Launcher · 电话 · 浏览器 · 设置 · 第三方 App 应用框架层 (Java API Framework) Activity Manager · Window Manager · Content Providers · View System 系统运行库 (Libraries) Surface Manager · Media Framework · SQLite · WebKit · OpenGL | ES SSL · libc · 等等 Android Runtime (ART) Dex 字节码解释器 · JIT 编译器 · 垃圾回收 核心库 (Core Libraries) 硬件抽象层 (HAL) Camera HAL · Audio HAL · Sensors HAL · GPS HAL · 等等 Linux 内核层 (Linux Kernel) 进程调度 · 内存管理 · 驱动模型 · 网络栈 · 电源管理

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」这件事,并没有想象中那么神秘。


公众号:蓝海资料掘金营,微信deep3321