第2章 开发环境搭建:Linux 开发环境配置、AOSP源码下载与编译、Camera HAL相关代码路径、交叉编译工具链配置

说实话,做Camera HAL适配这件事,环境搭建往往是第一个坑。我见过太多人花了一周时间折腾编译环境,结果还没开始写代码就心态崩了。今天我就把这几年的经验捋一捋,帮你把这条路铺平。

2.1 Linux开发环境配置

我个人习惯用Ubuntu 18.04或20.04 LTS。为什么?因为AOSP官方对这两个版本支持最好,驱动和工具链的兼容性问题最少。你想想看,要是系统版本太新,某些库的API变了,编译时冒出一堆莫名其妙的错误,那得多闹心。

基础依赖包,我建议一次性装全:

sudo apt-get update
sudo apt-get 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

嗯,这里要注意一点:Python版本。AOSP编译脚本依赖Python 2.7,但现代Ubuntu默认装的是Python 3。我遇到过好几次因为Python版本不对,编译到一半报错的情况。解决办法很简单:

sudo ln -s /usr/bin/python2.7 /usr/local/bin/python
避坑指南:我曾经在Ubuntu 22.04上折腾了整整两天,发现AOSP的某些旧版repo工具和新的OpenSSL库不兼容。最后老老实实换回20.04,半小时搞定。所以,别跟官方推荐版本对着干。

2.2 AOSP源码下载与编译

下载AOSP源码,说白了就是两件事:装repo工具,然后拉代码。

先装repo:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

然后初始化并同步。这里我建议你选一个稳定的tag,别用master分支。为什么?因为master天天变,你今天编译过了,明天可能就挂了。我一般用android-12.0.0_r32这样的长期支持版本。

mkdir aosp
cd aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r32
repo sync -j4 -c

-j4是并行下载线程数,根据你的网络和CPU核心数调整。我家里网络一般,设4就够用了。

编译的话,先加载环境变量:

source build/envsetup.sh
lunch aosp_arm64-eng
make -j8

lunch后面的target产品名,取决于你要适配的设备。如果是Pixel手机,可能是aosp_sailfish-userdebug。如果是你自己的开发板,那就得自己写BoardConfig了。

小技巧:第一次编译建议用make -j$(nproc),让系统自动检测CPU核心数。但如果你内存不够16GB,还是手动设小一点,不然编译到一半OOM,那叫一个酸爽。

2.3 Camera HAL相关代码路径

代码下载完了,你得知道Camera HAL到底藏在哪。我刚开始做的时候,在源码里翻了好久才找到。其实核心路径就这几个:

路径 说明
hardware/interfaces/camera/ Camera HAL的HIDL接口定义,这是HAL层和Framework的契约
hardware/libhardware/modules/camera/ 老版本的Camera HAL实现(HAL1),现在新项目基本不用了
hardware/google/camera/ Google官方的Camera HAL实现,很多厂商基于这个改
device/<vendor>/<product>/camera/ 各家芯片厂商(高通、MTK、展锐)的Camera HAL适配代码
frameworks/av/camera/ Camera Framework层,HAL的调用者

我个人习惯,拿到一个新平台后,先看hardware/interfaces/camera/下的HIDL文件。因为接口定义清楚了,你才知道HAL要实现哪些函数。说白了,这就是你和Framework之间的合同。

重点:Android 10之后,Camera HAL强制使用HIDL或AIDL接口。如果你还在用老式的HAL1方式,赶紧升级吧。我在一个项目里见过有人硬撑着用HAL1,结果CTS测试全挂,最后花了三周重写。

2.4 交叉编译工具链配置

交叉编译,说白了就是在PC上编译出能在ARM设备上跑的代码。AOSP自带了一套完整的工具链,但你得知道怎么用。

工具链位置:

prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/

这是64位ARM的工具链。如果是32位,用arm-linux-androideabi-那个目录。

不过说实话,现在新项目我更推荐用Clang。AOSP从Android 7.0开始就默认用Clang了,GCC已经逐渐被淘汰。Clang的错误信息更友好,编译速度也更快。

如果你要单独编译Camera HAL模块,可以这样:

source build/envsetup.sh
lunch aosp_arm64-eng
mma -j8 hardware/google/camera/

mma命令会编译当前目录及其子目录的所有模块。如果你只想编译某个特定模块,用mm命令。

注意:我曾经犯过一个低级错误——直接用PC的GCC编译HAL代码,然后丢到ARM设备上跑。结果一运行就Segmentation Fault。为什么?因为PC和ARM的ABI不一样,结构体对齐方式都不同。所以,永远用AOSP提供的交叉编译工具链,别自己瞎搞。

最后,验证工具链是否配置正确:

aarch64-linux-android-gcc --version

如果能正常输出版本信息,恭喜你,环境搭好了。接下来就可以开始写Camera HAL代码了。

嗯,环境搭建这部分就这些。看起来步骤不少,但只要你按部就班来,半天时间绝对能搞定。下一章我们聊聊Camera HAL的架构设计,那才是真正烧脑的地方。