使用OpenJDK8编译Android 7.1.2遇Ninja错误,求其他排查可能性
我来帮你梳理下除了禁用Ninja之外,可能导致这个编译错误的其他原因,都是基于Android 7.1.2编译环境的常见问题:
主机依赖包缺失或版本不匹配
Android 7.1.2的编译对32位系统库和一些工具的版本有严格要求,比如lib32z1-dev、lib32ncurses5-dev这类32位依赖,还有flex、bison的特定版本。如果这些依赖缺失或版本不对,会直接导致中间文件生成失败。
如果你用的是Ubuntu 16.04(官方推荐的编译系统版本),可以尝试重新安装完整依赖: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 lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip源码同步不完整或文件损坏
网络波动可能导致repo同步时漏掉部分文件,或者本地源码文件因中断编译损坏。你可以先执行repo sync -c -j$(nproc)重新同步,若问题依旧,检查本地是否有未提交的修改(用repo status查看),必要时重置到干净状态,甚至删除.repo以外的文件重新同步。编译缓存残留冲突
之前编译残留的缓存文件可能存在错误,导致Ninja无法正确解析依赖。可以先尝试清理缓存:执行m clean或者make clean,更彻底的方式是直接删除out目录:rm -rf out之后重新初始化编译环境:
source build/envsetup.sh && lunch,再重新启动编译。JDK环境变量配置异常
虽然你确认用的是OpenJDK8,但可能JAVA_HOME指向错误,或者PATH中其他JDK的优先级更高,导致编译过程中调用了非指定版本的JDK。可以通过以下命令验证:echo $JAVA_HOME # 应指向OpenJDK8的安装路径 java -version # 输出应为1.8.x javac -version # 输出应为1.8.x如果配置有误,修改
~/.bashrc或~/.profile文件,重新加载环境变量即可。Ninja版本不兼容
Android 7.1.2对Ninja的版本有特定要求,过新或过旧的版本都会引发依赖解析问题。可以尝试安装官方推荐的1.7.2版本:sudo apt-get install ninja-build=1.7.2-1若系统包管理没有对应版本,也可以从源码编译该版本的Ninja替换当前版本。
另外你提到的禁用Ninja的方案,本质是切换回传统Make编译系统,确实能绕过Ninja的依赖问题,但如果想保留Ninja的编译效率,上面的几个方向可以优先排查。
内容的提问来源于stack exchange,提问作者Peng

