2. 开发环境与源码获取

本章围绕 AOSP 源码下载、编译环境搭建以及 SystemUI 模块的独立构建展开,是整个课程的技术底座。你将在本地环境中完整操作一遍从拉取源码到单模块编译的过程,并掌握必要的调试命令与常见问题定位技巧。

2.1 AOSP 源码下载

推荐使用 repo 工具管理 AOSP 多仓库项目。以下为基于 Ubuntu 22.04 的标准操作流程。

  1. 安装 repo:
    mkdir ~/bin
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
    export PATH="$PATH:~/bin"
  2. 初始化工作目录并同步代码(以 android-14.0.0_r15 为例):
    mkdir ~/aosp && cd ~/aosp
    repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15
    repo sync -c -j8
    建议:初次同步耗时较长(约 60–120 分钟),请确保网络稳定且磁盘剩余空间 > 200GB。国内用户可使用清华或中科大镜像加速。

2.2 编译环境配置

AOSP 编译依赖特定的软件包和 JDK 版本。下表列出 Android 14 的核心依赖及其推荐版本:

依赖项推荐版本 / 命令
OpenJDK11(Ubuntu 默认 openjdk-11-jdk)
Python3.8–3.11
Make / Ninjamake 4.2+ / ninja 1.10+
其他系统库libncurses5, libx11-dev, libc6-dev-i386, git, gnupg, flex, bison, gperf, zip, curl, zlib1g-dev, g++-multilib

一键安装命令:

sudo apt update
sudo apt install -y openjdk-11-jdk python3 git-core gnupg flex bison build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 \
  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev
注意:不要使用 Ubuntu 自带的 default-jdk(可能为 JDK 17),AOSP 14 的 soong 构建系统对 JDK 17 支持不完整,编译时会出现符号表错误。

2.3 SystemUI 模块单独构建

在 AOSP 主工程中,使用 mmm 或 make SystemUI 编译 SystemUI 模块。推荐后者,更稳定。

# 加载编译环境(每次新终端都需要执行)
source build/envsetup.sh

# 选择目标(Pixel 6 模拟器或真机,此处以 aosp_cf_x86_64_phone-userdebug 为例)
lunch aosp_cf_x86_64_phone-userdebug

# 单独编译 SystemUI
make SystemUI -j$(nproc)

编译产物位于:

out/target/product/vsoc_x86_64/system/priv-app/SystemUI/SystemUI.apk

如只需编译 Java 代码(无需重新生成资源),可加速:

make SystemUI -j$(nproc) ANDROID_QUIET_BUILD=true

2.4 部署与调试

使用 ADB 将新编译的 APK 推送到设备并重启 SystemUI:

adb root
adb remount
adb push out/target/product/vsoc_x86_64/system/priv-app/SystemUI/SystemUI.apk /system/priv-app/SystemUI/
adb reboot

若仅调试代码,可使用 adb shell am restart 重启 SystemUI 进程(需 root):

adb shell pkill -f com.android.systemui
# 或
adb shell am force-stop com.android.systemui && adb shell am start -n com.android.systemui/.SystemUIService

查看实时日志:

adb logcat -s SystemUI SystemUIGoogle NavigationBar

2.5 常见错误与优化

  • 磁盘空间不足:AOSP 完整编译需约 300GB,可使用 make installclean 清理中间文件后重试。
  • Java 版本不匹配:执行 java -version 确认版本,通过 update-alternatives 切换至 JDK 11。
  • repo sync 卡死:因网络波动断开,增加 -j4 或使用 --fail-fast 快速定位失败仓库。
  • SystemUI 编译超时:加入 --no-skip-tools 或在 out/soong/build_number.txt 中跳过无关模块。
  • 真机无法 remount:刷入 userdebug 或 eng 版本镜像,并开启 USB 调试。
SystemUI 开发环境搭建流程 AOSP 源码下载 repo init + repo sync 编译环境配置 JDK 11 / Python / 系统库 SystemUI 单独编译 make SystemUI -j$(nproc) 部署 & 调试 adb push / adb logcat 常见错误 & 优化 磁盘清理 / JDK 切换 / 真机 remount 说明 每个环节都可单独迭代执行, 无需每次从头开始。
最佳实践:将 source build/envsetup.sh 和 lunch 命令写入 ~/.bashrc 别名,节省重复输入时间。推荐使用 ccache 加速二次编译,配置 export USE_CCACHE=1 并设置缓存大小 ccache -M 50G。