第二章:开发环境搭建:AOSP 源码下载、编译环境配置、模拟器与真机调试环境准备
好,咱们正式开始动手了。
这一章,说白了就是“把家伙事儿备齐”。
做 Camera HAL 开发,你绕不开 AOSP。源码怎么下?环境怎么配?模拟器能不能用?真机怎么连?
这些问题,我当年刚入行时一个个踩过坑。今天一次性给你讲透。
2.1 AOSP 源码下载:别让网络卡住你
下载 AOSP 源码,是很多新手的第一道坎。
为什么?因为源码仓库在 Google,国内网络环境你懂的。
我个人习惯用清华或中科大的镜像站。速度稳定,省心。
核心步骤:
- 安装 Repo 工具
- 初始化 Repo 仓库
- 同步源码
先装 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,社区支持好,文档也多。
准备工作:
- 解锁 bootloader:在开发者选项中开启 OEM 解锁,然后
fastboot flashing unlock - 刷入 AOSP 镜像:用
fastboot flashall刷入你编译好的镜像 - 验证 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 的架构设计。