1. 前言
我们做andorid系统开发,肯定时刻与源码打交到,特别是做新项目时,最重要的事情就是下载源码,然后配置环境编译,假如你的电脑是刚重装系统过,一个全新的开发环境,那么首要解决的事情就是完善好andorid源码编译的环境,你前期工作准备好的话,就可以减少在编译过程中频繁报错的次数。
关于源码编译环境可以参考官网: 建立构建环境 | Android 开源项目 | Android Open Source Project
2. 项目情况
本人是借用的一台全新安装的Ubuntu 18.04操作系统的电脑,重新下载一份Android 10项目代码,接下来就来准备前期工作。
2.1 安装所需的程序包(Ubuntu的18.04)
在终端命名安装:
sudo apt-get install 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
2.2 安装和配置工作中常用的包
一行一行的执行命令安装
git config --global core.editor vim
git config --global credential.helper store
sudo apt-get update
sudo apt install python libssl-dev python-crypto samba openssh-server libncurses5 libncurses5:i386 gitk net-tools flameshot vim ccache
sudo usermod -aG plugdev $LOGNAME
2.3 源码编译初始化
接下来进入到项目代码中,熟悉的命令:
1. source build/envsetup.sh
2. lunch xxx
3. make -j16
接下来就是编译开始..........
然后你的工作就来了,新电脑新环境,源码编译依赖的环境肯定没有安装全,或者依赖工具的版本不匹配,导致一直编译不过...... 但是不要心态炸裂,遇见什么问题就解决什么问题
3. 编译报错汇总
编译过程中,本人遇到过如下报错:
错误1:
【报错】 fatal error: openssl/名单.h: No such file or directory。
【解决方案】 就是没有安装libssl-dev~ sudo apt-get install libssl-dev
错误2:
【报错】:ImportError: No module named Crypto.Signature
ImportError: No module named Crypto.PublicKey
【解决方案】: sudo pip3 install pycryptodome
建议使用pycryptodome,它是pycrypto的延伸版本,用法和pycrypto 是一模一样的;
所以解决方案是安装pycryptodome
安装离线版的方法:
wget https://codeload.github.com/Legrandin/pycryptodome/zip/v3.8.2
unzip pycryptodome-3.8.2.zip
cd pycryptodome-3.8.2
sudo pip setup.py install
错误3:
【报错】:error while loading shared libraries: libncurses.so.5
【解决方案】: sudo apt-get install libncurses5 libncurses5:i386
错误4:
【报错】编译过程中:
******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1. You can add '@hide' javadoc comments to the methods, etc. listed in the
errors above.
2. You can update current.txt by executing the following command:
make android.test.mock.docs.system-update-current-api
To submit the revised current.txt to the main Android repository,
you will need approval.
******************************
【解决方案】:根据第二条提示: make android.test.mock.docs.system-update-current-api
错误5:
【报错】:/bin/bash: bison: command not found
【报错】: /bin/bash: xsltproc: command not found
【报错】:/bin/bash: flex: command not found
【报错】:/bin/bash: gcc: command not found
等等同类错误
【解决方案】:下文会说明
特别是第5类错误,我们可以在单独安装一下 sudo apt-get install xxx
但是呢,每次编译一下就报个错,你得停下来解决了,然后在重新编译验证,而且第一次编译时间本来就很长,着实很搞人心态。 那有没有办法解决呢?
4. 自检查环境
其实在第一次Android源码编译之前就可以大致检查下编译环境配置是否ok?
在你执行source build/envsetup.sh lunch xxx 命令后,终端会打印,如下:
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-2a
TARGET_CPU_VARIANT=cortex-a75
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-2a
TARGET_2ND_CPU_VARIANT=cortex-a55
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.15.0-46-generic-x86_64-Ubuntu-18.04.3-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
HOST_PYTHON_VERSION= 找不到文件
BUILD_ID=QP1A.190711.020
OUT_DIR=out
而且我上面的lunch后中,还有 HOST_PYTHON_VERSION= 找不到文件 提示, 这个就是python找不到 , 那么就是提示你要去安装python的环境
也会还有其他问题报错(根据具体项目会有差异),如下:
/bin/sh: 1.cc not found
recipe for target 'scripts/basic/fixdep' failed
recipe for target 'sub_make' failed
这个报错就提示你要去安装 gcc ,但是你安装的时候,提示你会有依赖,无法安装成功
怎么解决呢?下文会解决方法
对比配置ok后,lunch后成功执行完成的提示:
5. 最优解决方案
对于编译报错停止后,通过log, 我们肯定是缺什么就在去安装什么,比如当你看到 fatal error: zlib.h: No such file or directory 这个报错时,你的第一反应就是单独去安装zlib1g-dev : sudo apt-get install zlib1g-dev 一般情况下会有依赖,导致你安装不成功
这时你需要安装aptitude
1. sudo apt-get install aptitude
2. sudo aptitude install zlib1g-dev
接下来就如图下面选择:第一个选择n 第二个选择 Y
aptitude与 apt-get 一样,是 Debian 及其衍生系统中功能极其强大的包管理工具,与 apt-get 不同的是,aptitude在处理依赖问题上更佳一些。aptitude在删除一个包时,会同时删除本身所依赖的包。这样,系统中不会残留无用的包,整个系统更为干净。
也就是说当你安装么某个特定包的时候,出现依赖导致安装不成功,这个时候aptitude 就派上用场了,它的优点就是自动帮你解除依赖关系,非常省心地正常安装。
顺便提及一下其他 aptitude 的命令:
命令 | 作用 |
aptitude update | 更新可用的包列表 |
aptitude safe-upgrade | 执行一次安全的升级 |
aptitude full-upgrade | 将系统升级到新的发行版 |
aptitude install pkgname | 安装包 |
aptitude remove pkgname | 删除包 |
aptitude purge pkgname | 删除包及其配置文件 |
aptitude search string | 搜索包 |
aptitude show pkgname | 显示包的详细信息 |
aptitude clean | 删除下载的包文件 |
aptitude autoclean | 仅删除过期的包文件 |
6. 总结
在新电脑环境第一次编译andorid源码的时候,肯定会遇到很多编译问题,也需要我们有点耐心去解决问题, 所以前期尽可能的配置好编译环境,当你在第一次执行全部安装包命令(第二个步骤中比较长的命令)的时候,如果出现了某些有依赖的包,导致安装不成功的,一定要留下心,先记录下来。
接下来,在第4个步骤上,自检查下编译环境是否都正常?
然后把aptitude 安装上,接下来去单独安装有依赖的包,因为你前期不解决这些问题,在编译过程中肯定会遇上的,又来回折腾。
说了这么多,就是要把前期编译环境尽肯能配置完整一点,便于节省时间编出大版本。