第3章:开发环境搭建

说实话,做Camera HAL开发,环境搭建这一步就能劝退不少人。我见过太多人卡在AOSP编译上,一搞就是好几天。其实没那么玄乎,今天我把这些年踩过的坑、积累的经验,一次性说清楚。

3.1 Ubuntu环境配置

我个人习惯用Ubuntu 20.04 LTS。为什么?因为Google官方推荐,而且社区支持最好。你非要用22.04也行,但有些依赖包得自己折腾。

3.1.1 基础依赖安装

先更新源,然后装必要的包。我直接给命令,你照着敲就行:

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
注意: 我曾经在Ubuntu 22.04上装这些包时,发现libncurses5已经没了,得用libncurses5-dev替代。不同版本差异挺大,建议先查一下官方文档。

3.1.2 配置Git和Repo

Git配置是基本功,但很多人忽略。我建议你一开始就配好:

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global color.ui auto

然后装Repo工具。Repo是Google用来管理多Git仓库的神器,AOSP全靠它:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
小技巧: 如果下载慢,可以用清华或中科大的镜像源。我一般用清华的,速度稳定。

3.2 AOSP源码下载与编译

源码下载是整个环节最耗时的部分。我第一次下载时,整整花了两天。嗯,这里要注意网络环境。

3.2.1 选择分支

做Camera HAL开发,我建议选android-13.0.0_r41或android-12.0.0_r32。为什么?这两个版本稳定,而且Camera HAL架构比较成熟。你想想看,选太新的分支,可能遇到未修复的bug;选太老的,又缺乏新特性。

分支 Android版本 适用场景
android-13.0.0_r41 13 新项目开发,支持HAL3完整特性
android-12.0.0_r32 12 兼容性要求高的项目
android-11.0.0_r48 11 老平台维护,稳定性好

3.2.2 下载源码

初始化Repo仓库:

mkdir aosp
cd aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41

然后同步代码。这里我建议用-j参数并行下载,但别太大,否则容易断:

repo sync -j4 -c --no-tags

避坑指南: 我曾经用-j16下载,结果网络波动导致一半仓库没同步完。后来我学乖了,先用-j4跑一遍,再用repo sync -j8补全。稳得很。

3.2.3 编译AOSP

编译前先设置环境变量:

source build/envsetup.sh
lunch aosp_arm64-eng

然后开编。第一次编译建议用make -j4,虽然慢但不容易出错:

make -j4

编译时间取决于机器配置。我自己的工作站(32核,64G内存)大概40分钟。如果你用笔记本,可能得3-4小时。别急,去喝杯咖啡。

优化建议: 如果只改Camera HAL相关代码,可以用make -j8 camera.hal单独编译模块,省时间。

3.3 模拟器与真机调试环境

调试环境这块,我建议模拟器和真机都配好。模拟器方便快速验证,真机用来测实际效果。

3.3.1 模拟器配置

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

emulator -avd Pixel_6_API_33 -gpu host -memory 4096

这里-gpu host很重要,否则Camera预览会卡成PPT。我刚开始没加这个参数,调试Camera时画面一帧一帧跳,还以为是代码写错了。

3.3.2 真机调试

真机调试需要打开开发者选项和USB调试。这个大家都知道,但有个细节:

  • 连接后先运行adb devices确认设备识别
  • 如果显示unauthorized,检查手机上的授权弹窗
  • 建议用adb root获取root权限,方便查看系统文件
注意: 不是所有手机都支持adb root。如果不行,可以用adb remount重新挂载系统分区。我曾经在一台小米手机上折腾了半天,最后发现是内核没开root权限。

3.4 ADB与Logcat常用技巧

ADB和Logcat是Camera HAL调试的左右手。我每天至少用它们几百次。

3.4.1 ADB常用命令

除了基本的push/pull,这几个命令我几乎天天用:

# 查看Camera HAL进程
adb shell ps -A | grep camera

# 查看Camera HAL日志
adb logcat -s CameraHal

# 重启Camera服务
adb shell killall cameraserver

# 抓取Camera HAL的堆栈
adb shell dumpsys media.camera

3.4.2 Logcat过滤技巧

Logcat默认输出太多,不过滤根本没法看。我一般这样用:

# 只显示Camera相关日志
adb logcat -s CameraHal:V CameraService:V

# 保存日志到文件
adb logcat -v threadtime -s CameraHal:V > camera_log.txt

# 实时过滤,只显示错误
adb logcat -s *:E

个人经验: 调试Camera HAL时,我习惯同时开两个终端。一个跑adb logcat -s CameraHal:V看实时日志,另一个跑adb shell dumpsys media.camera看状态。这样问题定位快很多。

3.4.3 调试小技巧

最后分享几个我常用的调试技巧:

  • 抓取Camera HAL的dump信息: adb shell dumpsys media.camera -v 5,能看到所有Camera设备的详细状态
  • 模拟Camera HAL的异常场景:adb shell setprop persist.camera.hal.debug 5开启调试模式,日志会更详细
  • 快速重启Camera服务: 改完代码后,不用重启整个手机,adb shell killall cameraserver就行

嗯,环境搭建这部分就这些。说白了,就是耐心加细心。我第一次搭环境时也踩了不少坑,但后来发现,只要按步骤来,其实没那么难。下一章我们开始真正写Camera HAL代码,到时候你会感谢今天把环境搭好的自己。