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

做Sensor HAL开发,环境搭建是第一道坎。说实话,我见过太多人卡在这一步——源码下到一半断了,编译报错看不懂,模拟器跑不起来。嗯,今天咱们就把这些坑一个个填平。

3.1 AOSP源码下载:别让网络成为拦路虎

AOSP源码有多大?完整下载大概30GB+,编译后占用空间轻松超过200GB。所以第一件事:准备好硬盘空间。我个人习惯至少留出300GB,用SSD最好,机械硬盘编译一次够你喝杯咖啡再睡一觉。

3.1.1 安装Repo工具

Repo是Google专门为管理AOSP这种多仓库项目设计的工具。说白了,它就是个脚本,帮你批量操作Git仓库。

# 创建bin目录并加入PATH
mkdir ~/bin
PATH=~/bin:$PATH

# 下载Repo工具
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
小提示:如果curl下载失败,试试用Python的pip安装:pip install repo。我在国内某大厂项目时,内网连不上Google,就是用镜像站搞定的。

3.1.2 初始化并同步源码

选一个稳定的分支。做Sensor HAL开发,我建议用Android 13或14的稳定分支,太新的分支可能有未稳定的API。

# 创建工作目录
mkdir aosp-13
cd aosp-13

# 初始化仓库,指定分支
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41

# 同步源码(-j4表示4个并行任务,根据CPU核心数调整)
repo sync -j4 -c
注意:repo sync过程可能中断。我曾经同步到90%时网络断了,气得想砸电脑。解决方案:写个脚本循环执行repo sync -j4 -c,直到成功为止。

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

官方推荐Ubuntu 18.04或20.04。为什么?因为AOSP的编译工具链对Ubuntu支持最好。你非要用Arch Linux或Fedora?嗯,也可以,但你会遇到各种依赖问题,我劝你别自找麻烦。

3.2.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上编译Android 12,结果报错python未找到。原因是新版Ubuntu默认没有Python 2.7。解决方案:sudo apt-get install python2.7,然后创建软链接sudo ln -s /usr/bin/python2.7 /usr/bin/python。

3.2.2 安装JDK

Android 13及以上需要OpenJDK 11。别用Oracle JDK,我试过,兼容性问题一堆。

sudo apt-get install openjdk-11-jdk

3.2.3 配置编译缓存

这个很重要。每次编译都重新生成所有文件?太慢了。用ccache可以加速二次编译。

# 安装ccache
sudo apt-get install ccache

# 设置缓存大小(建议50GB以上)
ccache -M 50G

# 在~/.bashrc中添加
export USE_CCACHE=1
export CCACHE_DIR=/path/to/ccache

3.3 编译AOSP:第一次编译总是最慢的

第一次编译,全量构建,耗时2-4小时不等。我建议你晚上睡觉前开始编译,第二天早上起来就好了。

# 进入源码根目录
cd aosp-13

# 设置编译环境
source build/envsetup.sh

# 选择编译目标
# aosp_car_x86_64-userdebug 是模拟器常用目标
lunch aosp_car_x86_64-userdebug

# 开始编译(-j16根据CPU线程数调整)
make -j16
我的经验:编译时用top命令观察CPU和内存使用。如果内存不足(低于16GB),减少-j参数。我曾经在8GB内存的机器上编译,直接OOM(内存溢出),系统卡死。

3.4 模拟器调试环境:快速验证的首选

模拟器适合验证Sensor HAL的基本逻辑。但注意:模拟器的传感器数据是模拟的,不是真实硬件数据。

3.4.1 启动模拟器

# 编译完成后,模拟器镜像在 out/target/product/generic_x86_64/
# 直接启动
emulator -avd my_avd -wipe-data

# 或者从编译产物启动
emulator -kernel prebuilts/qemu-kernel/x86_64/kernel-qemu \
  -system out/target/product/generic_x86_64/system.img \
  -data out/target/product/generic_x86_64/userdata.img

3.4.2 验证Sensor HAL是否加载

# 进入模拟器shell
adb shell

# 查看传感器列表
dumpsys sensorservice

# 查看HAL模块是否加载
ls -l /vendor/lib/hw/sensors.*.so
注意:模拟器默认使用sensors.goldfish.so这个HAL实现。如果你编译了自己的Sensor HAL模块,需要替换这个文件。我踩过的坑:忘记更新manifest.xml,导致HAL模块没被加载。

3.5 真机调试环境:这才是实战

真机调试才是Sensor HAL开发的最终战场。模拟器能跑通,不代表真机没问题。我遇到过模拟器上一切正常,真机上传感器数据全是0的情况——原来是I2C通信时序不对。

3.5.1 解锁Bootloader并刷入编译镜像

# 进入fastboot模式(关机后按音量下+电源键)
adb reboot bootloader

# 刷入编译好的镜像
fastboot flashall -w

# 重启
fastboot reboot

3.5.2 使用adb调试Sensor HAL

# 查看传感器事件
adb shell getevent -l

# 查看特定传感器的数据
adb shell dumpsys sensorservice | grep -A 20 "Accelerometer"

# 实时监控logcat中HAL层的日志
adb logcat -s SensorsHAL:V
关键技巧:在HAL代码中添加ALOGD日志,方便调试。比如在sensors_poll_context_t::poll()中打印每次读取的数据。我曾经靠这个定位到一个加速度计数据抖动的问题——原来是滤波器参数没配置对。

3.6 知识体系总览

下面这张图概括了Sensor HAL开发环境的全貌。你看,从源码下载到真机调试,每一步都有坑,但每一步也都有解法。

Sensor HAL开发环境搭建流程 1. AOSP源码下载 repo init + repo sync 2. 编译环境配置 依赖包 + JDK + ccache 3. 编译AOSP lunch + make 4. 模拟器调试环境 emulator + adb shell + dumpsys 验证HAL模块加载与基本功能 5. 真机调试环境 fastboot刷机 + logcat + getevent 验证真实传感器数据与性能 ✅ Sensor HAL开发环境就绪

3.7 常见问题速查表

问题现象 可能原因 解决方案
repo sync卡住不动 网络不稳定或Git仓库过大 使用镜像站(如清华、中科大),或增加-j参数
编译报错"python: not found" 缺少Python 2.7 安装python2.7并创建软链接
模拟器启动黑屏 缺少GPU加速或镜像损坏 添加-gpu swiftshader_indirect参数
真机刷机后无法开机 镜像与设备不匹配 确认lunch目标与设备型号一致
HAL模块未加载 manifest.xml未配置 检查/vendor/etc/vintf/manifest.xml
最后说一句:环境搭建是最枯燥但最重要的一步。我当年第一次搭建AOSP环境,花了整整两天才跑通。但一旦环境好了,后面开发就顺风顺水。别急,慢慢来。
可可精品资料库