2、开发环境搭建:AOSP源码下载、编译环境配置、模拟器与真机调试准备

做Camera HAL开发,环境搭建是第一道坎。

说实话,我见过太多新手卡在这一步。源码下到一半断了,编译报错看不懂,模拟器跑不起来。嗯,这些坑我都踩过。今天我把完整流程拆开揉碎了讲,你跟着做就行。

2.1 AOSP源码下载:别让网络坑了你

下载AOSP源码,说白了就是跟Google的服务器打交道。国内网络环境你懂的,直接repo sync大概率会断。

我的做法是这样的:

  1. 先装repo工具
    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
  2. 初始化仓库

    选一个稳定的分支。我个人习惯用android-13.0.0_r41,这个版本Camera HAL相对成熟。

    mkdir aosp-13
    cd aosp-13
    repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
  3. 同步源码

    这里有个坑。直接repo sync -j4可能会卡死。我建议加个参数:

    repo sync -j4 --force-sync --no-clone-bundle
    ⚠️ 我曾经遇到过:同步到一半网络断了,重新跑repo sync时各种报错。后来发现加个--force-sync能强制覆盖本地冲突文件。另外,建议用screen或tmux挂后台,不然一关终端就白下了。

如果你在下载时遇到「无法连接到gerrit.googlesource.com」,别慌。试试清华或中科大的镜像:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r41

2.2 编译环境配置:Ubuntu 20.04 是最稳的

你想想看,AOSP编译对系统要求挺苛刻的。我试过Ubuntu 22.04,有些依赖包版本太高反而出问题。目前最稳的还是Ubuntu 20.04 LTS。

硬件要求:

项目 最低配置 推荐配置
CPU 4核 8核以上
内存 16GB 32GB
磁盘 200GB 500GB SSD
系统 Ubuntu 18.04 Ubuntu 20.04
💡 小提示:磁盘一定要留够。我有个同事用256GB的硬盘,编译到一半空间不足,最后只能删掉out目录重新来。建议至少400GB空闲空间。

安装依赖包:

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

嗯,这里要注意。Android 13开始需要Python 3.8以上。Ubuntu 20.04自带Python 3.8,刚好够用。如果你用Ubuntu 18.04,记得手动升级Python。

2.3 编译AOSP:第一次编译大概要2小时

环境配好了,开始编译。我个人习惯先编译一次完整的系统,后面改HAL模块时只编译模块,会快很多。

source build/envsetup.sh
lunch aosp_x86_64-eng
make -j$(nproc)

关键点:

  • aosp_x86_64-eng 是模拟器用的。如果你要编译真机镜像,选对应的设备名,比如 aosp_blueline-eng(Pixel 3)。
  • -j$(nproc) 表示用所有CPU核心编译。但如果你内存只有16GB,建议用 -j4,不然容易OOM。
  • 第一次编译建议用eng版本,带debug工具,方便调试。

编译过程中如果报错,别慌。90%的情况是缺依赖包。看报错信息,缺什么装什么就行。

⚠️ 我曾经遇到过:编译到99%突然报错,说某个so文件找不到。查了半天,发现是之前同步源码时网络中断,有个文件没下完整。解决办法:repo sync 重新同步一次,再 make clean && make

2.4 模拟器调试:快速验证Camera HAL

编译完成后,启动模拟器:

emulator -writable-system -show-kernel

-writable-system 这个参数很重要。不加的话,你push进去的HAL库重启就没了。

模拟器调试Camera HAL的步骤:

  1. 编译你的HAL模块
    mmm hardware/libhardware/modules/camera/
    make -j4
  2. push到模拟器
    adb root
    adb remount
    adb push out/target/product/generic_x86_64/system/lib64/hw/camera.*.so /system/lib64/hw/
    adb reboot
  3. 验证
    adb shell dumpsys media.camera

    看输出里有没有你的HAL版本信息。

💡 小提示:模拟器默认的Camera是虚拟的,不支持所有特性。如果你要测试ISP相关功能,建议用真机。模拟器更适合验证HAL接口调用流程。

2.5 真机调试准备:解锁、刷机、root

真机调试才是Camera HAL开发的常态。我建议准备一台Pixel设备,兼容性最好。

准备工作:

  1. 解锁Bootloader
    adb reboot bootloader
    fastboot flashing unlock

    注意:解锁会清空所有数据。记得先备份。

  2. 刷入编译好的镜像
    fastboot flashall -w

    -w 会清空data分区。如果你不想清,去掉这个参数。

  3. 获取root权限

    eng版本默认就有root。如果是userdebug版本,需要:

    adb root
    adb disable-verity
    adb reboot
    adb root
    adb remount
⚠️ 我曾经遇到过:刷完机后adb remount失败,提示「remount of the / superblock failed」。这是因为Android 13开始默认开启了动态分区。解决办法:编译时加上 BOARD_AVB_ENABLE := false,或者用 fastboot flash vbmeta vbmeta.img --disable-verity

2.6 调试工具链:你需要的都在这里

环境搭好了,工具也得备齐。我常用的调试工具清单:

工具 用途 安装方式
adb 设备通信、文件传输 AOSP自带
fastboot 刷机、解锁 AOSP自带
logcat 查看日志 AOSP自带
dumpsys 查看系统服务状态 AOSP自带
strace 跟踪系统调用 adb shell strace
GDB 调试native代码 交叉编译版本

我个人最常用的是logcat加grep过滤:

adb logcat -v threadtime | grep -E "Camera|HAL|hal"

这样只显示Camera相关的日志,不会刷屏。

2.7 避坑指南:我踩过的那些坑

总结一下常见问题:

  • 源码下载慢:用国内镜像,或者晚上下载(避开高峰)。
  • 编译报错:先看是不是缺包。缺包就装,装完记得 make clean
  • 模拟器起不来:检查KVM是否开启。运行 kvm-ok 确认。
  • 真机adb连不上:检查USB调试是否开启,驱动是否安装。
  • push HAL库后不生效:确认 adb remount 成功,或者直接刷入system.img。

环境搭建这块,说白了就是耐心活。我第一次搭环境花了整整两天,各种报错。但只要你按上面的步骤来,应该半天就能搞定。

下节课我们开始讲Camera HAL的架构。到时候我会结合代码,带你看看HAL层到底是怎么跟内核和Framework打交道的。