3. 开发环境搭建:AOSP源码下载、编译环境配置、模拟器与真机调试准备
好,咱们正式开始动手了。
这一章,我带你把开发环境搭起来。说白了,就是让你的电脑能下载AOSP源码、能编译、能跑模拟器、能连真机。这一步搞不定,后面全是纸上谈兵。
我个人习惯先把环境分成三块:源码下载环境、编译环境、调试环境。这三块各自有坑,咱们一个一个踩过去。
3.1 硬件与操作系统要求
先说说硬件。AOSP编译是个吃资源的大户。我当年第一次编译,拿一台4GB内存的笔记本硬跑,结果编译到一半直接OOM,系统卡死。嗯,从那以后我再也不建议用低配机器搞这个。
| 项目 | 最低要求 | 推荐配置 |
|---|---|---|
| CPU | 4核 | 8核以上 |
| 内存 | 16GB | 32GB或更高 |
| 磁盘 | 200GB空闲 | 500GB SSD |
| 操作系统 | Ubuntu 18.04 | Ubuntu 20.04 / 22.04 |
3.2 AOSP源码下载
源码下载,核心就两个工具:repo 和 git。repo是Google专门为AOSP这种多仓库项目写的管理工具。
3.2.1 安装repo工具
# 创建bin目录
mkdir -p ~/bin
# 下载repo脚本
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
# 加执行权限
chmod a+x ~/bin/repo
# 添加到PATH
export PATH=~/bin:$PATH
这里有个坑。repo脚本默认会从Google的服务器下载,国内网络环境你懂的。我曾经在客户现场配环境,死活下不下来,最后换了清华的镜像才搞定。
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
3.2.2 初始化并同步源码
# 创建工作目录
mkdir aosp
cd aosp
# 初始化仓库,指定分支
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r30
# 同步源码(这一步最耗时)
repo sync -j4 -c
-j4 表示用4个线程并行下载。你机器核多可以调大,比如 -j8。但注意,网络带宽不够的话,线程太多反而容易失败。我一般设成CPU核心数的一半。
同步完大概长这样:
aosp/
├── art/
├── bionic/
├── bootable/
├── build/
├── dalvik/
├── development/
├── device/
├── external/
├── frameworks/
├── hardware/
├── kernel/
├── packages/
├── system/
├── vendor/
└── Makefile
3.3 编译环境配置
源码下好了,接下来配编译环境。AOSP编译依赖一堆工具链,缺一个就报错。我建议你一次性装全。
3.3.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
这是Ubuntu 20.04的依赖列表。如果你用22.04,有些包名可能变了。比如 libncurses5 改成了 libncurses5-dev。遇到报错别慌,缺什么装什么就行。
3.3.2 安装JDK
AOSP 13 需要 JDK 11 或更高版本。我个人习惯用OpenJDK:
sudo apt-get install openjdk-11-jdk
验证一下:
java -version
# 输出类似:openjdk version "11.0.18"
3.3.3 配置编译环境
每次编译前,需要先加载环境变量:
source build/envsetup.sh
然后选择编译目标:
lunch aosp_x86_64-eng
这里解释一下目标格式:设备名-编译类型。编译类型有三种:
| 类型 | 说明 | 适用场景 |
|---|---|---|
| eng | 工程版,带调试工具 | 开发调试 |
| userdebug | 用户调试版,有root权限 | 功能验证 |
| user | 用户版,无root | 发布测试 |
我平时开发用 eng 最多,因为它自带adb root权限,调试方便。
3.4 编译AOSP
环境配好,开始编译。命令很简单:
make -j8
第一次编译时间很长。我实测过,8核16GB的机器,编译AOSP 13大概需要2-3小时。你可以趁这个时间喝杯咖啡,或者看看文档。
out/target/product/ 目录下。比如你编译的是 aosp_x86_64,那么镜像文件就在 out/target/product/generic_x86_64/ 里。
如果编译中途报错,别慌。常见错误有:
- 磁盘空间不足:out目录会占用大量空间,确保有100GB以上空闲
- 内存不足:减少
-j参数,比如改成-j4 - 依赖缺失:看报错信息,缺什么装什么
3.5 模拟器调试
编译成功之后,启动模拟器:
emulator
如果提示找不到命令,先执行:
source build/envsetup.sh
lunch aosp_x86_64-eng
emulator
模拟器启动后,你可以用adb连接:
adb devices
# 应该能看到 emulator-5554 device
这里有个小细节。模拟器默认不带Google服务,所以Play商店什么的别想了。但咱们做系统开发,够用了。
3.6 真机调试准备
真机调试,核心就两步:打开开发者选项、配置adb。
3.6.1 开启开发者选项
- 进入「设置」→「关于手机」
- 连续点击「版本号」7次
- 返回设置主界面,就能看到「开发者选项」了
在开发者选项里,打开:
- USB调试
- OEM解锁(如果需要刷机)
3.6.2 配置adb
连接手机后,运行:
adb devices
如果看到 unauthorized,说明手机还没授权。在手机上确认允许USB调试即可。
如果看不到设备,可能是驱动问题。Linux下需要添加udev规则:
# 创建规则文件
sudo vim /etc/udev/rules.d/51-android.rules
# 添加内容(以Google Pixel为例)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"
# 重载规则
sudo udevadm control --reload-rules
sudo udevadm trigger
厂商ID列表:
| 厂商 | idVendor |
|---|---|
| 18d1 | |
| Samsung | 04e8 |
| Xiaomi | 2717 |
| OnePlus | 2a70 |
3.7 本章知识体系
我把这一章的核心逻辑画成了流程图,方便你理解整体脉络:
3.8 常见问题与避坑指南
ninja: build stopped: subcommand failed。查了半天,发现是磁盘空间不够。out目录占了180GB,而我的分区只有200GB。从那以后,我每次编译前都会用 df -h 看一眼磁盘。
make framework -j8
这样只编译framework模块,速度快很多。全量编译只在第一次做就行。
好了,环境搭好了,下一章咱们开始真正动手——自定义飞行模式的逻辑实现。
公众号:蓝海资料掘金营,微信deep3321