2. 开发环境搭建:Ubuntu系统配置、JDK与SDK安装、Repo工具使用、Git版本控制基础

说实话,搭建开发环境这件事,看着简单,但坑是真不少。我见过太多新手一上来就急着编译,结果环境没配好,卡在某个错误上一整天。咱们今天就把这事一次搞定。

2.1 Ubuntu系统配置——选对版本很重要

做Android车机系统编译,我强烈推荐Ubuntu 18.04 LTS20.04 LTS。为什么?因为Google官方文档里,AOSP(Android Open Source Project)的编译环境就是基于这两个版本验证的。你非要用22.04也行,但有些依赖包得自己折腾,何必呢?

系统装好后,第一件事就是换源。国内网络环境你懂的,不改源的话,下载速度会让你怀疑人生。

# 备份原源
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
我的习惯:每次装完系统,我会先装一个vimcurl。别问为什么,后面你调试脚本、看日志的时候就知道有多重要了。

接下来安装编译必需的依赖包。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
注意:千万别漏了libncurses5这个包。我曾经有一次编译到一半报错,查了半天才发现是ncurses库没装。那感觉,就像跑马拉松到终点前摔了一跤。

2.2 JDK与SDK安装——版本匹配是门学问

Android车机系统的编译,对JDK版本有严格要求。不同Android版本对应不同JDK,搞错了编译直接报错。

Android版本 所需JDK版本 备注
Android 8.x (Oreo) JDK 8 Ubuntu 18.04自带
Android 9.x (Pie) JDK 8 推荐OpenJDK
Android 10/11 JDK 8 或 JDK 11 看具体分支
Android 12+ JDK 11 必须用JDK 11

我个人习惯用OpenJDK,省去Oracle的授权麻烦。安装方式很简单:

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

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

# 切换默认JDK版本
sudo update-alternatives --config java

SDK的安装,我建议直接用Android Studio自带的SDK Manager。但如果你像我一样喜欢命令行操作,可以手动下载:

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

# 安装SDK
./sdkmanager "platforms;android-31" "build-tools;31.0.0"

避坑指南:我曾经在Ubuntu 20.04上装JDK 11,结果发现系统自带的版本是11.0.11,而AOSP要求11.0.13以上。解决办法是手动从Adoptium下载安装。记住,版本号差一个小数点都可能编译失败

2.3 Repo工具使用——管理多仓库的瑞士军刀

Android源码不是单个Git仓库,而是由几百个Git仓库组成的。Repo就是Google专门为管理这种多仓库项目设计的工具。

安装Repo很简单:

# 创建bin目录
mkdir -p ~/bin

# 下载Repo脚本
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

# 添加到PATH
echo 'export PATH=$PATH:~/bin' >> ~/.bashrc
source ~/.bashrc

Repo的核心命令就几个,我列出来你感受一下:

  • repo init — 初始化项目,指定manifest仓库
  • repo sync — 同步所有仓库代码
  • repo start — 创建新分支
  • repo status — 查看所有仓库状态
  • repo diff — 查看所有仓库的差异

实际工作中,我最常用的场景是这样的:

# 初始化车机系统源码(以某厂商分支为例)
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r32

# 同步代码(加-j参数并行下载,速度翻倍)
repo sync -j8 -c
我的经验:repo sync时加-c参数只下载当前分支,不加的话会把所有分支都拉下来。你想想看,几百个仓库每个都有几十个分支,那得下到猴年马月去?

2.4 Git版本控制基础——车机开发必备技能

Git在Android开发中的重要性,怎么说都不为过。车机系统开发涉及多个团队协作,没有Git寸步难行。

先配置好你的身份信息,这是最基本的:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global color.ui true

车机开发中,我总结了一套实用的Git工作流:

  1. 拉取最新代码repo syncgit pull
  2. 创建功能分支repo start my-feature
  3. 修改代码:用你喜欢的编辑器
  4. 查看改动git statusgit diff
  5. 提交改动git add + git commit
  6. 推送审核repo upload

这里有个小技巧,我经常用:

# 查看某个文件的历史修改
git log --oneline --follow 某个文件路径

# 查看某次提交改了哪些文件
git show --stat 提交哈希值

# 撤销未提交的修改
git checkout -- 文件名
血的教训:我曾经在车机项目里,不小心在master分支上直接改了代码,然后git commit了。结果发现跟别人的改动冲突,回滚花了一下午。记住,永远不要在master分支上直接改代码,一定要先创建自己的分支。

嗯,到这里开发环境就搭好了。你可能会问,为什么没讲Docker?其实Docker在车机编译中确实有用,但那是进阶内容。先把基础环境搞扎实,后面咱们再聊容器化的事。

下一章,咱们开始真正接触Android车机系统的源码结构。到时候你会发现,环境搭好了,后面的路就好走多了。