Ubuntu 14.04编译Android 4.4.2源码实战指南
1. 项目背景与意义
在移动开发领域,编译Android源代码是一项极具挑战性又充满价值的工作。我最近在Ubuntu 14.04 LTS系统上成功编译了Android 4.4.2(KitKat)的完整源代码,整个过程耗时约36小时,遇到了不少值得分享的技术细节和解决方案。
Android 4.4.2作为2013年发布的经典版本,至今仍被许多定制ROM开发者研究和修改。通过从源码编译,开发者可以:
- 深度定制系统功能
- 修改底层框架行为
- 学习Android系统架构
- 为老旧设备提供优化支持
2. 环境准备与系统配置
2.1 硬件要求
建议配置不低于:
- 四核CPU(实测双核编译需要48+小时)
- 16GB内存(8GB勉强可用但需大量swap)
- 150GB可用磁盘空间(源码+编译产物)
注意:虚拟机性能损失严重,建议物理机安装。我在VirtualBox中测试时编译时间延长了3倍。
2.2 系统环境搭建
Ubuntu 14.04 LTS默认配置不满足编译要求,需执行以下准备:
# 安装基础工具链 sudo apt-get update sudo apt-get install 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 # 特别注意事项:必须使用特定版本的Java和Make sudo apt-get install openjdk-6-jdk sudo update-alternatives --config java # 确保选择Java6 wget http://ftp.gnu.org/gnu/make/make-3.81.tar.gz tar xvf make-3.81.tar.gz cd make-3.81 ./configure && make && sudo make install3. 源码获取与预处理
3.1 下载源代码
由于官方repo工具需要Python2.7+,而Ubuntu 14.04默认是2.7.6,可直接使用:
mkdir ~/android-4.4.2 cd ~/android-4.4.2 repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2 repo sync -j4 # 根据网络情况调整并发数实测数据:完整源码约8.5GB,同步时间取决于网络(我在100M宽带下用了6小时)
3.2 源码补丁处理
遇到的主要兼容性问题及解决方案:
- GCC版本冲突:
# 在prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.7目录下 find . -name "*.mk" | xargs sed -i 's/ifneq (\$(filter 4.6%, \$(CC_VERSION)),)/ifneq (\$(filter 4.6% 4.8%, \$(CC_VERSION)),)/g'- Python脚本兼容性:
# 修改build/tools/releasetools/common.py import sys reload(sys) sys.setdefaultencoding('utf8') # 添加在文件开头4. 编译过程详解
4.1 初始化编译环境
source build/envsetup.sh lunch full-eng # 选择eng构建类型4.2 关键编译参数
在build/core/main.mk中建议修改:
# 提高并行编译效率 export USE_CCACHE=1 export CCACHE_DIR=/tmp/ccache prebuilts/misc/linux-x86/ccache/ccache -M 50G # 针对多核优化 export JAVAC_ARGS="-J-Xmx2048m" export JAVA_TOOL_OPTIONS="-Xmx2048m"4.3 启动编译
make -j$(($(nproc)*2)) 2>&1 | tee build.log编译过程监控技巧:
watch -n 60 'tail -n 20 build.log; free -h; df -h /'5. 常见问题排查
5.1 内存不足错误
症状:g++: internal compiler error: Killed (program cc1plus)
解决方案:
sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile5.2 Java版本冲突
错误示例:Unsupported major.minor version 51.0
必须确保:
java -version # 应显示1.6.x javac -version # 应显示1.6.x5.3 文件系统inode耗尽
错误:No space left on device但df显示有空间
检查并清理:
df -i # 查看inode使用 find /tmp -type f -atime +1 -delete6. 编译成果验证
成功编译后会生成:
out/target/product/generic/system.img out/target/product/generic/ramdisk.img out/target/product/generic/userdata.img启动模拟器测试:
emulator -avd test -system out/target/product/generic/system.img -show-kernel7. 性能优化记录
通过多次编译尝试,总结出以下加速技巧:
- ccache配置:
export CCACHE_SLOPPINESS=time_macros,include_file_mtime export CCACHE_CPP2=yes- 选择性编译:
mmm frameworks/base # 仅编译特定模块- 增量编译:
touch frameworks/base/core/java/android/app/Activity.java make -j8整个项目最耗时的部分是libwebviewchromium的编译,单独耗时约5小时。建议首次编译后备份out目录,后续可以快速恢复。
8. 后续开发建议
基于编译好的环境,可以进一步:
- 修改framework层代码后重新编译单个模块
- 刷入真机测试(需对应设备驱动)
- 使用
make sdk生成定制版SDK - 通过
make bootimage快速迭代内核修改
我在Nexus 5设备上测试时发现,需要额外获取设备专属的vendor blobs才能正常启动。这部分可以通过extract-files.sh脚本从原厂镜像中提取。
