4. 源码目录结构解析
任务目标
在开始编译AOSP ROM之前,必须理解源码树的核心目录布局。本案例以AOSP 13 (Android 13) 为参考,解析aosp/根目录下各关键目录的职责与依赖关系,并提供一个可执行的脚本,用于快速生成当前源码树的目录结构摘要,帮助你建立对ROM编译流程中“输入”的全局认知。
核心目录职责速查
| 目录/文件 | 职责 | 与编译的关系 |
|---|---|---|
build/ | Soong构建系统、Makefile核心、Blueprint文件 | 编译入口,source build/envsetup.sh即来源于此 |
frameworks/ | Android框架层Java/Native服务、系统UI | 编译产出framework.jar、system_server |
packages/ | 系统应用(Settings、Launcher3等) | 产出APK,ROM中预置应用来源 |
vendor/ | 厂商定制、硬件抽象(HAL)、专有库 | 设备树配置,决定产品形态 |
device/ | 设备型号配置、BoardConfig、产品mk | lunch目标定义位置 |
kernel/ | Linux内核源码(若包含) | 编译boot.img中的内核镜像 |
external/ | 第三方开源库(如sqlite、libpng) | 被框架或应用依赖的Native库 |
system/ | 底层系统组件(core、media、netd) | 基础守护进程与库 |
hardware/ | 硬件抽象层接口定义与参考实现 | HAL接口兼容性保障 |
out/ | 编译输出目录(自动生成) | 产物存放,可删除以清理 |
vendor/与device/区别 | vendor存放二进制/闭源,device存放开源配置 | 两者共同定义具体设备 |
目录结构解析脚本
以下脚本扫描AOSP根目录,输出每个一级子目录的占用空间、文件数量及顶层子目录列表,帮助你快速识别源码树规模与组织方式。将脚本保存为scan_aosp_tree.sh并置于AOSP根目录下执行。
#!/bin/bash
# 用法: ./scan_aosp_tree.sh [源码根目录]
# 功能: 统计AOSP一级子目录的顶层条目数与磁盘占用,识别核心目录是否存在
AOSP_ROOT="${1:-.}"
cd "$AOSP_ROOT" || { echo "无法进入目录: $AOSP_ROOT"; exit 1; }
echo "=== AOSP 源码根目录: $(pwd) ==="
echo ""
# 核心目录存在性检查
CORE_DIRS="build frameworks packages vendor device kernel external system hardware"
echo "--- 核心目录检查 ---"
for d in $CORE_DIRS; do
if [ -d "$d" ]; then
echo "[存在] $d"
else
echo "[缺失] $d"
fi
done
echo ""
echo "--- 一级子目录顶层条目数统计 ---"
# 排除隐藏目录与out目录(out可能巨大且非源码)
for dir in */; do
dir_name="${dir%/}"
# 跳过out目录以节省统计时间
[ "$dir_name" = "out" ] && continue
if [ -d "$dir_name" ]; then
# 统计该目录下直接子项(文件+目录)数量
count=$(ls -1 "$dir_name" 2>/dev/null | wc -l)
# 获取磁盘占用(人性化显示)
size=$(du -sh "$dir_name" 2>/dev/null | cut -f1)
printf "%-20s 条目数: %-8s 占用: %s\n" "$dir_name" "$count" "$size"
fi
done
echo ""
echo "--- 关键文件检查 ---"
[ -f "build/envsetup.sh" ] && echo "[找到] build/envsetup.sh" || echo "[缺失] build/envsetup.sh"
[ -f "build/soong/soong_ui.bash" ] && echo "[找到] build/soong/soong_ui.bash" || echo "[缺失] build/soong/soong_ui.bash"
[ -f "device/*/AndroidProducts.mk" ] && echo "[找到] 设备产品定义" || echo "[注意] 未在device下找到AndroidProducts.mk(可能位于vendor或其他路径)"
echo ""
echo "=== 扫描完成 ==="
运行与验证
执行方式:
chmod +x scan_aosp_tree.sh
./scan_aosp_tree.sh /path/to/aosp
若已在AOSP根目录内,可直接执行./scan_aosp_tree.sh。
验证通过条件:
- 脚本输出中,
build、frameworks、packages、system、vendor、device均显示[存在]。 build/envsetup.sh与build/soong/soong_ui.bash均显示[找到]。- 统计列表中,
frameworks的条目数通常最多(数百个),external次之;out目录被正确跳过。 - 若
device下无AndroidProducts.mk,脚本会提示注意——这表示设备配置可能位于vendor/<厂商>/device/路径,属于正常变体。
预期输出片段(示例,非实测):
--- 核心目录检查 ---
[存在] build
[存在] frameworks
[存在] packages
[存在] vendor
[存在] device
[存在] kernel
[存在] external
[存在] system
[存在] hardware
--- 一级子目录顶层条目数统计 ---
build 条目数: 14 占用: 89M
frameworks 条目数: 23 占用: 2.1G
packages 条目数: 18 占用: 780M
...
常见问题
- 脚本执行报错
du: 无法访问:某些目录可能因权限或符号链接问题无法统计,不影响核心功能,可忽略或使用sudo执行。 - 未找到
kernel/目录:部分AOSP发布版不预置内核源码,需单独下载,属正常现象。 - 如何理解
out/目录:编译产物均输出至此,若磁盘空间不足,可执行rm -rf out/清理后重新编译。