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、产品mklunch目标定义位置
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。

验证通过条件:

  1. 脚本输出中,build、frameworks、packages、system、vendor、device均显示[存在]。
  2. build/envsetup.sh与build/soong/soong_ui.bash均显示[找到]。
  3. 统计列表中,frameworks的条目数通常最多(数百个),external次之;out目录被正确跳过。
  4. 若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/清理后重新编译。