2. 开发环境搭建:AOSP源码下载与编译、Camera HAL模块编译、adb调试环境配置、logcat与dmesg使用
好,咱们直接进入正题。做Camera HAL开发,环境搭不好,后面全是坑。我见过太多新人卡在编译环境上,一折腾就是两三天。今天我把这些年踩过的坑和总结的经验,一次性说清楚。
2.1 AOSP源码下载:别让网络成为绊脚石
下载AOSP源码,说白了就是跟Google的服务器较劲。国内网络环境你懂的,我建议直接用清华或中科大的镜像站。
核心步骤:
- 安装repo工具:
mkdir ~/bin && curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo && chmod a+x ~/bin/repo - 初始化仓库:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r30 - 同步代码:
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开发了。
最后说一句:环境搭建这事儿,一次搞定,后面省心。我建议你把安装步骤写成脚本,下次换机器直接跑。别像我一样,每次重装系统都手动配一遍,浪费时间。