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

好,咱们正式开始动手了。

这一章,说白了就是“把家伙事儿备齐”。

做 Camera HAL 开发,你绕不开 AOSP。源码怎么下?环境怎么配?模拟器能不能用?真机怎么连?

这些问题,我当年刚入行时一个个踩过坑。今天一次性给你讲透。

2.1 AOSP 源码下载:别让网络卡住你

下载 AOSP 源码,是很多新手的第一道坎。

为什么?因为源码仓库在 Google,国内网络环境你懂的。

我个人习惯用清华或中科大的镜像站。速度稳定,省心。

核心步骤:

  1. 安装 Repo 工具
  2. 初始化 Repo 仓库
  3. 同步源码

先装 Repo:

mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo

然后初始化。这里要注意分支的选择。

做 Camera HAL 开发,我建议选 android-13.0.0_r41 或更新的版本。太老的版本,HAL 接口差异大,学了容易过时。

mkdir aosp-13
cd aosp-13
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r41
repo sync -c -j8

小技巧:

-j8 表示 8 个线程并行下载。如果你的电脑是 16 核,可以改成 -j16。但别太大,否则网络容易断。

我曾经用 -j32 下到一半,网络直接挂了。嗯,血的教训。

同步时间取决于你的网速。我一般晚上挂着下,第二天早上就好了。

如果中途断了,别慌。重新执行 repo sync -c -j8 就行,它会断点续传。

2.2 编译环境配置:Ubuntu 是首选

AOSP 官方推荐 Ubuntu 18.04 或 20.04。我个人用 Ubuntu 20.04,稳得很。

为什么不用 Windows?你想想看,AOSP 的编译工具链全是 Linux 原生的。Windows 上折腾 WSL 或虚拟机,性能损耗不说,坑还多。

需要安装的依赖包:

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 版本,包名可能略有差异。比如 Ubuntu 22.04 把 libncurses5 改成了 libncurses5-dev。如果安装时报错,搜一下对应版本就行。

避坑指南:

我曾经在 Ubuntu 22.04 上编译 AOSP 12,结果报错说 Python 版本不对。AOSP 12 需要 Python 2.7,但 22.04 默认只有 Python 3。

解决方案:手动安装 Python 2.7,并设置 python 软链接指向它。

所以,如果你用新系统,最好先查一下 AOSP 版本对 Python 的要求。

Java 环境也要配。AOSP 13 需要 OpenJDK 11:

sudo apt-get install openjdk-11-jdk

验证一下:

java -version
# 输出应为 openjdk version "11.0.x"

2.3 模拟器调试:快速验证的好帮手

没有真机时,模拟器是你的好朋友。

但注意,模拟器上的 Camera HAL 是虚拟的,功能有限。它适合验证框架层逻辑,不适合调试底层驱动。

编译模拟器镜像:

source build/envsetup.sh
lunch sdk_phone_x86_64
make -j8

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

emulator

个人经验:

模拟器启动后,用 adb shell 进去,看看 /vendor/lib/hw/ 目录下有没有 camera.*.so 文件。

如果有,说明 HAL 层加载成功了。如果没有,检查一下 lunch 选择的产品是不是带 camera 支持的。

模拟器的 Camera HAL 实现,在源码里对应 hardware/libhardware/modules/camera/ 目录。你可以改里面的代码,然后重新编译模拟器镜像来测试。

但说实话,模拟器的 Camera 性能很差。我一般只用它验证接口调用流程,不会用它做性能测试。

2.4 真机调试环境准备:这才是主战场

真机调试,才是 Camera HAL 开发的常态。

你需要一台解锁了 bootloader 的手机,比如 Pixel 系列。我个人推荐 Pixel 6 或 Pixel 7,社区支持好,文档也多。

准备工作:

  1. 解锁 bootloader:在开发者选项中开启 OEM 解锁,然后 fastboot flashing unlock
  2. 刷入 AOSP 镜像:用 fastboot flashall 刷入你编译好的镜像
  3. 验证 adb 连接adb devices 能看到设备

重要提醒:

解锁 bootloader 会清除手机所有数据。记得先备份。

另外,有些厂商的手机解锁后会影响保修。建议用专门的开发机。

真机调试 Camera HAL 时,我常用的命令:

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

# 查看 Camera HAL 服务状态
adb shell dumpsys media.camera

# 抓取 Camera HAL 日志
adb logcat -s CameraHal:V

# 推送修改后的 HAL 库
adb root
adb remount
adb push out/target/product/pantah/vendor/lib/hw/camera.*.so /vendor/lib/hw/
adb reboot

调试技巧:

我习惯在 HAL 代码里加 ALOGD 日志,然后通过 logcat 实时查看。

比如在打开 Camera 时打印:

ALOGD("openCamera: camera_id=%d", camera_id);

这样能快速定位问题出在哪个环节。

还有一个坑:adb remount 有时会失败,提示 remount of the superblock failed

这是因为 Android 13 开始,系统分区默认是动态分区。需要用 adb disable-verity 关闭验证,然后重启再 remount。

我曾经在这个问题上卡了半天。嗯,后来发现是忘了关 verity。

2.5 开发环境验证:跑一个简单的测试

环境搭好了,怎么知道能不能用?

我建议跑一个简单的 Camera 测试用例。

AOSP 源码里自带了一个 Camera2Basic 示例应用。编译它:

cd packages/apps/Camera2Basic
mm

然后安装到真机或模拟器上:

adb install out/target/product/pantah/data/app/Camera2Basic/Camera2Basic.apk

打开应用,如果能正常预览和拍照,说明你的开发环境基本没问题。

如果闪退,检查 logcat 里的错误信息。常见问题包括:

  • HAL 库没加载成功
  • 权限没给(Android 6.0+ 需要动态申请 Camera 权限)
  • SurfaceView 或 TextureView 配置不对

最后说一句:

开发环境搭建,看起来琐碎,但真的很重要。

我见过太多人,环境没配好就开始写代码,结果编译报错、运行崩溃,折腾半天发现是环境问题。

所以,花点时间把这一步做扎实。后面你会感谢自己的。

好,这一章就到这里。下一章我们开始深入 Camera HAL 的架构设计。