AOSP 目录及其作用
一. 主要目录结构及其作用
目录路径 | 主要作用描述 | 代表性内容 |
---|---|---|
art/ | Android Runtime的源码。负责AOT/JIT编译、垃圾回收(GC)等 | Dex2oat工具, Runtime库 |
bionic/ | Android自定义的C库(libc)、动态链接器(linker)等。替代了GNU的glibc | libc.so , libm.so , libdl.so , linker |
bootable/ | 启动相关的代码 | recovery/ (恢复模式),bootloader/ (引导加载程序参考实现) |
build/ | 构建系统的核心。包含各种Makefile、Shell脚本、Python工具(如soong)。定义编译规则和流程 | core/ (主Makefile), soong/ (新的构建系统) |
cts/ | Compatibility Test Suite (兼容性测试套件)。用于确保设备兼容Android生态系统 | 大量测试用例 |
dalvik/ | 旧版Dalvik虚拟机的源码(现已基本被ART取代) | |
developers/ | 示例代码和工具 | |
device/ | 设备专用代码和配置。这是定制化最关键的目录,通常按<厂商>/<设备> 存放 | google/coral (Pixel 4), generic/common (模拟器)。包含BoardConfig.mk , *.mk , sepolicy , init.rc 等。 |
external/ | 大量的第三方开源项目。Android系统集成了众多优秀开源库 | openssl/ , sqlite/ , skia/ (2D图形库), v8/ (JavaScript引擎) |
frameworks/ | Android Framework的核心,提供应用开发所需的所有API和服务 | |
frameworks/base/ | 最核心的Framework。AMS, WMS, PMS等系统服务,以及所有@hide 的API都在这里 | core/ , services/ , native/ (SurfaceFlinger等) |
frameworks/av/ | 音视频相关框架 | services/ (AudioFlinger, MediaPlayerService) |
frameworks/native/ | 本地系统服务、图形库等 | opengl/ (GL ES), vulkan/ , services/ (SurfaceFlinger) |
frameworks/rs/ | RenderScript计算框架 | |
hardware/ | 硬件抽象层(HAL)的接口定义和实现。是连接Android系统和高通/MTK等厂商驱动代码的桥梁 | interfaces/ (HIDL定义), libhardware/ (旧版HAL), qcom/ , broadcom/ 等厂商实现 |
kernel/ | 存放内核源码的占位符。通常是一个指向具体内核版本的软链接。实际内核源码需要单独下载 | |
libcore/ | Java API的核心库实现 | ojluni/ (OpenJDK的改编), dalvik/ (部分遗留), json/ |
out/ | 编译输出目录。所有编译生成的临时文件和最终镜像都在这里。此目录不在版本控制中,由编译系统创建 | |
packages/ | 系统自带的应用程序和核心内容提供者 | |
packages/apps/ | 系统App | Settings/ , Launcher3/ , Dialer/ , SystemUI/ |
packages/providers/ | 系统ContentProvider | CalendarProvider/ , ContactsProvider/ |
packages/services/ | 系统Service | Telephony/ , Car/ |
prebuilts/ | 预编译好的工具和库,为了加速编译过程 | gcc/ (交叉编译工具链), clang/ (Android主编译器), ndk/ , sdk/ |
sdk/ | Software Development Kit的相关工具 | |
system/ | 一些核心的系统工具和守护进程 | |
system/core/ | 系统核心工具和库 | init (第一个用户进程), adb/ , logcat/ , libcutils/ (工具库) |
system/sepolicy/ | SELinux安全策略文件。定义所有进程和文件的访问权限,对系统安全至关重要 | |
system/vold/ | Volume Daemon,负责磁盘管理和挂载 | |
system/extras/ | 额外的系统工具和测试程序 | |
vendor/ | 厂商专用软件和配置。类似于device/ ,但更侧重于软件闭源部分。Google、三星、华为等会在这里放置私有代码 | google/ (Google Apps), qcom/ (高通相关) |
makefile | 构建系统的入口点 |
二. 编译成果物及存放位置
编译完成后,所有产出都在 out/
目录下。其结构如下:
out/host/
○ 内容:在开发主机(你的电脑) 上运行的工具和库
○ 子目录:
●linux-x86/
(在Linux系统下):包含最终生成的主机工具:
如adb
,fastboot
,aapt
,signapk.jar
等
○ 用途:这些工具用于后续的打包、签名、刷机等操作out/target/
○ 内容:用于目标设备(车机) 的所有东西
○ 关键子目录:
●product/
:按产品划分的输出
●<product_name>/
(如generic_car_arm64/
):这是最核心的目录
●obj/
:编译过程中产生的中间对象文件(.o
)和模块目标(如APPS
,JAVA_LIBRARIES
,ETC
●system/
:模拟Android
设备上的/system
分区结构。包含系统镜像的原始文件
●system/app/
:系统App(APK)
●system/bin/
:系统二进制可执行文件(如surfaceflinger
,vold
)
●system/lib/
,system/lib64/
:系统库(.so
文件)
●system/framework/
:Java框架JAR包(framework.jar
,services.jar
等)
●system/build.prop
:系统属性文件
●vendor/
:模拟/vendor
分区结构,存放厂商相关文件
●root/
:模拟root
目录,最终会打包进boot.img
的ramdisk
●symbols/
:包含带调试符号的库和可执行文件,用于gdb
调试
●*.img
:最终生成的、可以刷写的镜像文件(见第三部分)
三. 最终烧录镜像的文件格式
编译最终会生成多个 .img
文件,这些就是通过 fastboot
或其他刷机工具烧录到车机eMMC存储芯片各分区的镜像。它们通常是 sparse
格式(一种压缩格式,fastboot
可以识别)或 raw
格式(ext4
)
镜像文件名 | 对应分区 | 文件系统格式 | 内容描述 | 来源目录 |
---|---|---|---|---|
boot.img | boot | 特殊格式 | 内核和初始内存磁盘(ramdisk)。包含Linux Kernel、设备树(dtb )和启动到init 进程所需的初始根文件系统 | out/target/product/<name>/root + 内核 |
vendor.img | vendor | ext4 / erofs | 厂商专用软件和HAL。包含设备制造商提供的硬件抽象层(HAL)库、固件、闭源驱动等 | out/target/product/<name>/vendor/ |
system.img | system | ext4 / erofs | 只读的Android系统核心。包含Framework、系统服务、原生App(Settings, Launcher等)。A/B分区中为system_a/img | out/target/product/<name>/system/ |
system_ext.img | system_ext | ext4 / erofs | 系统扩展。存放一些不属于核心Android但又是系统级别的应用和库 | out/target/product/<name>/system_ext/ |
product.img | product | ext4 / erofs | 产品特定配置。用于存放与特定产品(如车机、电视)形态强相关的应用和配置 | out/target/product/<name>/product/ |
vbmeta.img | vbmeta | 特殊格式 | 验证启动元数据。包含用于验证其他分区完整性的哈希值和描述符,是Android Verified Boot (AVB) 的核心 | 由avbtool 生成 |
dtbo.img | dtbo | 特殊格式 | 设备树叠加层。用于在不重新编译内核的情况下,对基础设备树进行修改(如配置GPIO引脚),常见于Project Treble设备 | 由设备树源文件(.dts )编译而来 |
super.img | super | 特殊格式 | 动态分区容器。在支持动态分区的设备上,system , vendor , product 等镜像会被打包成一个super.img 再进行刷写 | 由lpmake 工具将上述多个img 打包而成 |
userdata.img | userdata | ext4 / f2fs | 用户数据分区。包含用户安装的应用、设置、媒体文件等。首次刷机时通常是空的或包含最小数据 | out/target/product/<name>/data/ |
cache.img | cache | ext4 | 缓存分区。用于系统更新下载和临时文件。现在作用已减小,很多设备可能不再需要 | 空分区或极小分区 |
recovery.img | recovery | 特殊格式 | 恢复模式分区。包含一个最小的Linux系统,用于系统恢复、清除数据、刷入OTA更新包等。其结构与boot.img 类似 | out/target/product/<name>/recovery/root |
总结与流程
- 源码 (
aosp/
): 你编写的代码和配置(C++
,Java
,Android.bp
,.mk
,.rc
,.xml
) - 编译 (
out/
): 构建系统将源码编译、链接、打包成主机工具和目标文件(.so
,.jar
,.apk
,.bin
),并按照分区结构组织在out/target/product/<name>/system/
等目录下 - 打包 (
*.img
): 构建系统使用make_ext4fs
,lpmake
,avbtool
等工具,将组织好的文件打包成对应分区的镜像文件(system.img
,vendor.img
,super.img
等) - 烧录: 通过
fastboot flash boot boot.img
、fastboot flash super super.img
等命令,或将镜像文件打包成OTA包,将这些img
文件烧写到车机的对应分区中,完成系统部署