2. 开发环境搭建:AOSP源码下载与编译、Camera HAL模块编译、adb调试环境配置、logcat与dmesg使用

好,咱们直接进入正题。做Camera HAL开发,环境搭不好,后面全是坑。我见过太多新人卡在编译环境上,一折腾就是两三天。今天我把这些年踩过的坑和总结的经验,一次性说清楚。

2.1 AOSP源码下载:别让网络成为绊脚石

下载AOSP源码,说白了就是跟Google的服务器较劲。国内网络环境你懂的,我建议直接用清华或中科大的镜像站。

核心步骤:

  1. 安装repo工具:mkdir ~/bin && curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo && chmod a+x ~/bin/repo
  2. 初始化仓库:repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r30
  3. 同步代码:repo sync -c -j8

这里有个坑——repo sync经常断。我个人的习惯是写个脚本循环跑,断了自动重连。你想想看,几十G的代码,断一次重来,心态直接崩了。

我的小技巧:repo sync -c -j8 --force-sync --no-clone-bundle 参数,能减少不少网络问题。另外,第一次同步建议用 -j4,别贪多,否则容易把服务器搞崩。

2.2 编译环境:Ubuntu 20.04 是最稳的选择

我试过Ubuntu 18.04、22.04,甚至折腾过Arch Linux。说实话,Ubuntu 20.04 LTS是最省心的。为什么?因为Google官方测试环境就是它。

必备软件包安装:

sudo apt-get install 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。我曾经有一次编译到一半报错,查了半天才发现是这玩意儿没装。你说气不气人?

2.3 Camera HAL模块编译:从全编译到单模块

全编译一次AOSP,少说一两个小时。做HAL开发,你不可能每次都全编。所以,单模块编译是必须掌握的技能。

先看看Camera HAL在源码里的位置:

hardware/qcom/camera/          # 高通平台
hardware/google/camera/        # Google Pixel
hardware/mediatek/camera/      # 联发科

编译单个模块的命令:

source build/envsetup.sh
lunch aosp_blueline-userdebug
make camera.qcom -j8   # 高通Camera HAL模块

我个人习惯用 mmm 命令,更快:

mmm hardware/qcom/camera/ -j8

避坑指南:我曾经犯过一个低级错误——改了HAL代码后,只编译了模块,但忘了push到设备上。结果调试了半天,发现跑的还是旧代码。记住:adb remount && adb push 是必须的。

编译完成后,输出文件一般在 out/target/product/设备名/system/lib/hw/ 下,比如 camera.qcom.so

2.4 adb调试环境配置:你的瑞士军刀

adb是Android调试的基石。配置其实很简单,但有几个细节要注意。

首先,添加USB设备权限:

# 创建规则文件
sudo vim /etc/udev/rules.d/51-android.rules

# 添加内容(以Google设备为例)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

# 重启udev
sudo udevadm control --reload-rules

然后,确保adb服务正常:

adb kill-server
adb start-server
adb devices

如果设备列表是空的,别慌。先检查USB线——我遇到过好几次,数据线只能充电不能传数据。换根线就好了。

我的经验:调试Camera HAL时,建议用 adb root 获取root权限。很多HAL层的调试接口需要root才能访问。另外,adb remount 可以把system分区挂载为可读写,方便push文件。

2.5 logcat与dmesg:调试的两大利器

做Camera HAL调试,logcat和dmesg就像你的左右手。一个看上层日志,一个看内核日志。

2.5.1 logcat:上层日志的王者

Camera相关的日志,通常用这些命令:

# 查看所有Camera日志
adb logcat -s CameraHal:V Camera:V

# 带时间戳,方便分析时序
adb logcat -v time -s CameraHal:V

# 保存到文件,回头慢慢分析
adb logcat -d -f /data/local/tmp/camera.log -s CameraHal:V

这里有个技巧——CameraHal:V 表示Verbose级别,能看到最详细的日志。但生产环境不建议开,日志量太大,会影响性能。

2.5.2 dmesg:内核日志的利器

HAL层跟内核驱动打交道时,很多问题在logcat里看不到,得看dmesg:

# 实时查看内核日志
adb shell dmesg -w

# 过滤Camera相关
adb shell dmesg | grep -i camera

# 查看最后100条
adb shell dmesg | tail -100

实战案例:有一次,我调试一个预览黑屏的问题。logcat里一切正常,但dmesg里看到了 camera sensor power on failed。原来是电源管理芯片的GPIO配置错了。你看,不看dmesg,这个问题根本定位不了。

2.6 环境验证:确保一切就绪

环境搭好了,怎么验证?我一般跑一个简单的测试:

# 1. 验证adb连接
adb devices

# 2. 验证root权限
adb root

# 3. 验证HAL模块是否存在
adb shell ls -l /vendor/lib/hw/camera.*.so

# 4. 验证logcat是否正常
adb logcat -c && adb logcat -s CameraHal:V & sleep 2 && adb shell dumpsys media.camera

如果以上都正常,恭喜你,环境搭好了。接下来就可以开始真正的HAL开发了。

最后说一句:环境搭建这事儿,一次搞定,后面省心。我建议你把安装步骤写成脚本,下次换机器直接跑。别像我一样,每次重装系统都手动配一遍,浪费时间。