2. 开发环境搭建:Ubuntu系统配置、JDK与SDK安装、Repo工具使用、Git版本控制基础
说实话,搭建开发环境这件事,看着简单,但坑是真不少。我见过太多新手一上来就急着编译,结果环境没配好,卡在某个错误上一整天。咱们今天就把这事一次搞定。
2.1 Ubuntu系统配置——选对版本很重要
做Android车机系统编译,我强烈推荐Ubuntu 18.04 LTS或20.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
vim和curl。别问为什么,后面你调试脚本、看日志的时候就知道有多重要了。
接下来安装编译必需的依赖包。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工作流:
- 拉取最新代码:
repo sync或git pull - 创建功能分支:
repo start my-feature - 修改代码:用你喜欢的编辑器
- 查看改动:
git status和git diff - 提交改动:
git add+git commit - 推送审核:
repo upload
这里有个小技巧,我经常用:
# 查看某个文件的历史修改
git log --oneline --follow 某个文件路径
# 查看某次提交改了哪些文件
git show --stat 提交哈希值
# 撤销未提交的修改
git checkout -- 文件名
git commit了。结果发现跟别人的改动冲突,回滚花了一下午。记住,永远不要在master分支上直接改代码,一定要先创建自己的分支。
嗯,到这里开发环境就搭好了。你可能会问,为什么没讲Docker?其实Docker在车机编译中确实有用,但那是进阶内容。先把基础环境搞扎实,后面咱们再聊容器化的事。
下一章,咱们开始真正接触Android车机系统的源码结构。到时候你会发现,环境搭好了,后面的路就好走多了。