第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
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之间的合同。
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命令。
最后,验证工具链是否配置正确:
aarch64-linux-android-gcc --version
如果能正常输出版本信息,恭喜你,环境搭好了。接下来就可以开始写Camera HAL代码了。
嗯,环境搭建这部分就这些。看起来步骤不少,但只要你按部就班来,半天时间绝对能搞定。下一章我们聊聊Camera HAL的架构设计,那才是真正烧脑的地方。