4. JDK安装与配置:OpenJDK版本选择、环境变量设置、验证安装

好,咱们继续往下走。这一章聊JDK,也就是Java开发工具包。你可能会问:「编译AOSP跟Java有什么关系?」关系大了去了。AOSP的构建系统、Makefile、还有不少工具链,底层都依赖Java。说白了,没有JDK,你连source build/envsetup.sh这步都跑不下去。

我个人习惯在搭建环境时,先把JDK搞定。因为后面很多坑,其实都是Java版本不对埋下的。嗯,咱们今天就把它彻底讲清楚。

4.1 为什么是OpenJDK?

你可能听说过Oracle JDK,也听说过OpenJDK。在AOSP的世界里,官方推荐的是OpenJDK。为什么?

  • 开源协议兼容:AOSP本身是开源项目,OpenJDK也是GPL协议,两者没有授权冲突。
  • 长期维护:OpenJDK有社区和各大厂商(Red Hat、Google等)持续维护,稳定性有保障。
  • 无商业限制:Oracle JDK在某些场景下需要商业授权,而OpenJDK完全免费。

我在项目中遇到过有人用Oracle JDK编译AOSP,结果在生成jack-server时莫名其妙报错。换回OpenJDK后,问题立刻消失。所以,别折腾,直接用OpenJDK。

4.2 版本选择:到底该用哪个版本?

这个问题,我每次带新人时都会被问到。答案其实很简单:看AOSP分支

不同Android版本对JDK版本有明确要求。我整理了一张表,你直接对照着选就行:

Android版本 AOSP分支 推荐JDK版本
Android 6.0 (Marshmallow) android-6.0.1_rXX OpenJDK 7
Android 7.x (Nougat) android-7.1.2_rXX OpenJDK 8
Android 8.x (Oreo) android-8.1.0_rXX OpenJDK 8
Android 9.x (Pie) android-9.0.0_rXX OpenJDK 8
Android 10+ android-10.0.0_rXX 及以上 OpenJDK 11

核心原则:如果你不确定,优先选OpenJDK 11。因为从Android 10开始,Google已经全面转向JDK 11。对于Android 8/9,JDK 8是安全选择。Android 6及以下,才需要JDK 7。

你想想看,如果你用JDK 8去编译Android 14的代码,构建系统会直接报错,提示你JDK版本不匹配。我曾经在升级项目时忘了改JDK版本,白白浪费了半天排查时间。嗯,这种低级错误,咱们尽量避免。

4.3 安装OpenJDK

以Ubuntu 20.04/22.04为例,安装OpenJDK 11的命令如下:

# 更新包索引
sudo apt update

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

# 验证安装
java -version

如果你需要安装OpenJDK 8:

sudo apt install openjdk-8-jdk

安装完成后,系统可能会同时存在多个JDK版本。这时候需要设置默认版本:

sudo update-alternatives --config java

这个命令会列出所有已安装的Java版本,你输入对应的数字就能切换。我个人习惯只保留一个JDK版本,避免混乱。

小技巧:安装完成后,可以用 update-alternatives --list java 查看当前系统上所有Java路径。如果发现路径不对,手动调整一下。

4.4 环境变量设置

安装完JDK只是第一步。你还得告诉系统,Java装在哪里。这就是环境变量的作用。

打开 ~/.bashrc~/.zshrc(取决于你用的Shell),在文件末尾添加:

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

然后让配置生效:

source ~/.bashrc

这里有个坑,我必须要提醒你:JAVA_HOME的路径一定要写对。不同Ubuntu版本、不同JDK版本,路径可能不一样。比如OpenJDK 8的路径通常是 /usr/lib/jvm/java-8-openjdk-amd64

怎么确认路径?用这个命令:

ls -l /usr/lib/jvm/

你会看到类似这样的输出:

lrwxrwxrwx 1 root root   22 Mar 15 10:00 java-11-openjdk-amd64 -> /usr/lib/jvm/java-11-openjdk-amd64

把那个实际路径填到 JAVA_HOME 里就行。

警告:千万不要把 JAVA_HOME 设置成 /usr/bin/java 这种路径。那是可执行文件的路径,不是JDK的根目录。设置错了,AOSP的构建脚本会找不到 javacjar 等工具。

4.5 验证安装

配置完成后,我们来验证一下。打开终端,依次执行:

# 检查Java版本
java -version

# 检查JAVA_HOME是否生效
echo $JAVA_HOME

# 检查javac编译器
javac -version

正确的输出应该类似:

openjdk version "11.0.22" 2024-01-16
OpenJDK Runtime Environment (build 11.0.22+7-post-Ubuntu-0ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.22+7-post-Ubuntu-0ubuntu222.04, mixed mode)

/usr/lib/jvm/java-11-openjdk-amd64

javac 11.0.22

如果 echo $JAVA_HOME 输出为空,说明环境变量没生效。检查一下 ~/.bashrc 里的配置,或者重新 source 一下。

我曾经遇到过一种情况:明明设置了 JAVA_HOME,但 java -version 显示的版本不对。后来发现是系统里装了多个JDK,而 PATH 里先找到了另一个版本的 java。解决办法是把 $JAVA_HOME/bin 放在 PATH 的最前面。

4.6 避坑指南

最后,分享几个我踩过的坑:

  • 不要用apt安装的默认JDK:Ubuntu仓库里可能同时有多个版本,默认安装的不一定是你需要的。手动指定版本号。
  • 不要忽略32位库:如果你在64位系统上编译旧版AOSP(比如Android 6.0),可能需要安装32位兼容库。命令是 sudo apt install libc6-i386
  • 不要忘记设置JAVA_HOME:AOSP的构建脚本会读取这个变量。没设置的话,编译到一半会报错,提示找不到Java。

嗯,JDK这块就这么多。配置好了,后面编译AOSP才能顺风顺水。下一章,咱们聊聊Git和Repo的配置,那是下载源码的关键工具。