1. AOSP 8.1编译环境准备
作为一名长期从事Android系统开发的工程师,我深知编译AOSP(Android Open Source Project)过程中会遇到的各种"坑"。特别是对于较老的版本如8.1(Oreo),在现代Ubuntu系统上编译会遇到更多兼容性问题。下面我将分享完整的编译流程和实战经验。
1.1 系统选择与基础配置
强烈建议使用Ubuntu 16.04 LTS作为编译环境,原因有三:
- 官方文档明确推荐16.04作为AOSP 8.1的编译环境
- 新版本Ubuntu(如22.04)缺少老版本依赖库,如libncurses5
- 实测在22.04上即使通过WITH_=false参数编译成功,刷机后也会出现无限重启问题
基础软件包安装:
bash复制sudo apt update
sudo apt install -y git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip
注意:必须安装32位兼容库,因为Android编译过程中部分工具链仍是32位的
1.2 Java环境配置
AOSP 8.1需要Java 8环境:
bash复制sudo apt install -y openjdk-8-jdk
配置JAVA_HOME环境变量(添加到~/.bashrc):
bash复制export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
验证Java版本:
bash复制java -version
# 应显示"1.8.0_xxx"
1.3 磁盘空间优化
AOSP源码下载后约50GB,编译后需要150GB+空间。建议:
- 使用独立分区或外接硬盘
- 删除不必要的系统软件:
bash复制sudo apt remove --purge libreoffice* thunderbird rhythmbox cheese
2. 源码下载与驱动准备
2.1 源码下载
推荐使用清华镜像源加速下载:
bash复制mkdir ~/aosp
cd ~/aosp
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-8.1.0_r1
repo sync -j4
遇到分卷压缩包时合并方法:
bash复制cat aosp810r1.z01 aosp810r1.z02 aosp810r1.zip > combined.zip
unzip combined.zip
安全提示:下载完成后建议彻底删除临时文件
bash复制shred -vzu -n 3 combined.zip
2.2 设备驱动下载
对于Pixel设备,需要从Google开发者网站下载专有驱动:
- 访问 https://developers.google.cn/android/drivers
- 查找对应设备型号和Android 8.1的驱动包
- 解压后得到两个脚本文件:
bash复制./extract-google_devices-sailfish.sh
./extract-qcom-sailfish.sh
驱动文件会解压到vendor/目录,这是刷机必需的二进制组件。
3. 编译过程详解
3.1 初始化编译环境
bash复制source build/envsetup.sh
lunch aosp_sailfish-userdebug # 以Pixel为例
3.2 解决常见编译错误
错误1:libncurses.so.5缺失
bash复制sudo apt-get install libncurses5:i386 libncurses5-dev
错误2:Jack server SSL error
修改prebuilts/sdk/tools/jack-admin:
bash复制JACK_SERVER_COMMAND="java -Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts -Djavax.net.ssl.trustStorePassword=changeit -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
错误3:Python版本冲突
AOSP 8.1需要Python 2:
bash复制sudo apt install python
export LC_ALL=C # 解决locale问题
3.3 开始编译
建议使用ccache加速后续编译:
bash复制export USE_CCACHE=1
ccache -M 50G # 设置缓存大小
make -j$(nproc) # 使用所有CPU核心编译
完整编译可能需要4-8小时,取决于硬件配置。
4. 刷机与问题排查
4.1 刷机准备
- 解锁bootloader:
bash复制adb reboot bootloader
fastboot flashing unlock
- 进入fastboot模式后刷入镜像:
bash复制fastboot flash boot boot.img
fastboot flash system system.img
fastboot flash vendor vendor.img
fastboot reboot
4.2 常见刷机问题
问题1:fastboot找不到设备
解决方法:
- 检查USB线(建议使用原装线)
- 在开发者选项中启用OEM解锁和USB调试
- 手机USB连接模式选择"文件传输"而非"仅充电"
问题2:刷机后无限重启
可能原因:
- 使用了不兼容的Ubuntu版本编译(如22.04)
- 驱动文件不完整
- 刷入了不匹配的镜像
解决方案:
- 回退到Ubuntu 16.04环境重新编译
- 确保正确解压了所有驱动文件
- 双清(wipe data/cache)后重新刷机
5. 性能优化与调试技巧
5.1 编译加速方案
- ccache配置:
bash复制export CCACHE_DIR=/mnt/ssd/ccache # 使用SSD存储缓存
ccache -M 100G # 增大缓存大小
- 内存优化:
在~/.bashrc中添加:
bash复制export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
- 并行编译:
根据CPU核心数调整:
bash复制make -j$(($(nproc)*2)) # 通常核心数×2是最佳值
5.2 实用调试命令
- 查看系统日志:
bash复制adb logcat -b all # 查看完整日志
adb logcat *:E # 只显示错误日志
- 检查分区信息:
bash复制adb shell ls -l /dev/block/platform/soc/ # 查看设备分区
- 系统属性调试:
bash复制adb shell getprop # 获取所有系统属性
6. 经验总结与避坑指南
经过多次完整编译和刷机测试,以下是我总结的关键经验:
-
环境一致性最重要:所有开发组成员应使用完全相同的Ubuntu版本和软件包版本,避免"在我机器上能编译"的问题。
-
磁盘空间监控:编译过程中使用df -h监控磁盘空间,建议保留至少50GB余量。
-
网络问题处理:
bash复制repo sync -j4 --fail-fast # 遇到网络错误时快速失败
- 版本控制建议:
bash复制repo forall -c 'git tag -l' # 查看所有git仓库的标签
- 增量编译技巧:
bash复制make -j$(nproc) showcommands # 显示详细编译命令
最后提醒:AOSP编译是个系统工程,遇到问题时建议:
- 首先检查官方文档和已知issue
- 保持环境干净,避免随意安装额外软件
- 做好时间规划,完整编译可能需要多次尝试
