3、开发环境搭建:Ubuntu系统配置、JDK与SDK安装、IDE(IntelliJ/Android Studio)配置

好,咱们直接进入正题。搞Framework源码调试,环境搭不好,后面全是坑。我见过太多人卡在第一步,代码下下来编译不过,IDE里跳转不了,最后心态崩了。其实没那么玄乎,一步步来就行。

3.1 Ubuntu系统配置——别偷懒,这是地基

我个人习惯用Ubuntu 20.04 LTS,稳定,社区支持好。你问我为什么不用最新版?嗯,有些老版本的AOSP分支对新系统的兼容性不太好,我踩过这个坑。

注意: 千万别用Windows直接搞AOSP编译,除非你想体验什么叫“绝望”。WSL2勉强能跑,但IO性能差一大截,我试过一次,编译时间翻倍。

装好系统后,第一件事就是换源。国内用户你懂的,不改源的话,apt下载能急死人。

# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源(以Ubuntu 20.04为例)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

sudo apt update && sudo apt upgrade -y

然后装一些基础依赖。AOSP官方文档列了一堆包,我帮你精简一下,这些都是我反复验证过的。

sudo apt install -y 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 libxml2-utils xsltproc unzip fontconfig
小技巧: 装完后记得重启一下,或者至少重新登录。有些环境变量需要刷新,不然后面编译会报一些莫名其妙的错。

3.2 JDK安装——版本选错,寸步难行

JDK版本这事儿,说起来都是泪。AOSP不同分支对JDK版本要求不一样。Android 10及以前用OpenJDK 8,Android 11开始用OpenJDK 11。你想想看,要是拿JDK 11去编译Android 9的代码,那编译脚本直接罢工。

我建议你装两个版本,用update-alternatives切换。这样切换分支时不用重装。

# 安装OpenJDK 8
sudo apt install openjdk-8-jdk

# 安装OpenJDK 11
sudo apt install openjdk-11-jdk

# 配置默认版本
sudo update-alternatives --config java

运行上面最后一条命令后,终端会列出已安装的JDK版本,输入编号就能切换。我个人习惯把JDK 11设为默认,因为现在主流分支都用它。

验证安装:
java -version
# 输出示例:
# openjdk version "11.0.18" 2023-01-17
# OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1)
# OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu120.04.1, mixed mode)

我曾经遇到过一个情况:明明装了JDK 11,但编译时还是报错说找不到JDK。后来发现是JAVA_HOME环境变量没设对。所以记得在~/.bashrc里加上这句:

export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

然后source ~/.bashrc让它生效。

3.3 SDK安装——别下错版本

SDK其实不用自己手动装,AOSP编译脚本会自动下载需要的工具链。但如果你要单独调试某个App,或者用Android Studio看源码,那还是得备一份。

我推荐用命令行工具装,干净利落。

# 下载命令行工具
wget https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip
unzip commandlinetools-linux-*.zip -d ~/Android/cmdline-tools

# 创建目录结构(注意:必须这样放)
mkdir -p ~/Android/cmdline-tools/latest
mv ~/Android/cmdline-tools/* ~/Android/cmdline-tools/latest/ 2>/dev/null || true

# 设置环境变量
export ANDROID_HOME=~/Android
export PATH=$ANDROID_HOME/cmdline-tools/latest/bin:$PATH

# 安装SDK平台(以API 33为例)
sdkmanager "platforms;android-33" "build-tools;33.0.2"
避坑指南: 我曾经把cmdline-tools直接解压到~/Android/下,结果sdkmanager死活不认。后来才发现,它要求目录结构必须是cmdline-tools/latest/bin/,少一层都不行。

3.4 IDE配置——IntelliJ vs Android Studio

这个问题我经常被问到:到底用哪个?我的答案是——看场景。

场景 推荐IDE 原因
只看Framework源码 IntelliJ IDEA 轻量,索引快,不装插件也能跳转
同时开发App Android Studio 自带Gradle支持,调试App方便
编译+调试Framework Android Studio 可以直接attach到模拟器进程

我个人习惯用IntelliJ IDEA看源码,用Android Studio做调试。为什么?因为IDEA启动快,索引完整个AOSP也就十几分钟。Android Studio加载一堆Gradle插件,光同步就要半天。

3.4.1 生成IDE配置文件

AOSP自带了一个脚本,可以生成IntelliJ/Android Studio的项目配置文件。你想想看,要是手动导入几千个Java文件,那不得累死?

# 在AOSP根目录执行
source build/envsetup.sh
lunch aosp_x86_64-eng
make idegen && development/tools/idegen/idegen.sh

执行完后,根目录会生成android.iprandroid.iml两个文件。用IntelliJ直接打开android.ipr就行。

提示: 第一次打开时,IDE会疯狂索引,内存占用可能飙到8GB+。建议在idea.vmoptions里把堆内存调大:-Xms4g -Xmx8g。我自己的机器是32GB内存,给IDE分了12GB,索引完大概15分钟。

3.4.2 配置源码跳转

索引完成后,你会发现代码跳转基本能用。但有些地方跳不过去,比如R文件、aidl生成的代码。这是因为它们还没编译出来。

解决办法:先编译一次完整的out目录。

make -j$(nproc)

编译完后,IDE会自动识别out/soong/.intermediates下的中间文件。这时候你再点R.id.something,就能直接跳到对应的资源ID了。

核心配置总结:
  • JDK版本:OpenJDK 11(主流),OpenJDK 8(老分支)
  • SDK路径:$ANDROID_HOME指向~/Android
  • IDE内存:至少4GB起步,推荐8GB+
  • 源码索引:先跑idegen.sh,再编译一次out目录

好了,环境搭完,下一步就是拉源码了。别急,先把这些配好,后面编译调试才能顺风顺水。要是遇到问题,回头看看是不是哪步漏了——我敢说,90%的问题都是环境没配对。