都2023了,在下才尝试下载Android8源码并试图编译,本文将讨论如何一步一步的编译Android8源码以及运行,遇到的问题也会给出搜索过后的解决办法。相信有缘人通过这篇文章能够节省至少半天的时间,因为本文主打一个字:快!从而提升进一步学习源码的决心
本次源码编译将在虚拟机中进行,其特点是要舍得给虚拟机分配cpu和内存,否则奇奇怪怪的错误会找上门
根据官网设置 Linux 构建环境的指示
我们采用ubuntu18.04来构建,私以为跟着官方超,不会挨弯刀
本次编译源码的大前提大致有如下几点
源码和编译输出放到两个不同的磁盘中,即将源代码下载到android8source.vmdk中(源码下载请参考行云流水地下载最小Android8源码),将编译输出放到android8sourceCompileOut.vmdk中
使得源码编译资源利用最大,我决定源码编译在ubuntu18.04的server中进行,运行模拟器的系统在ubuntu18.04的desktop中进行
经过编译后,我会将总结放到文末
编译输出磁盘创建
参考使用单独的输出目录给出的建议,为加快编译速度,我们将构建输出到另一个磁盘中,为此我们需要为虚拟机增加一块新的硬盘。以期达到源码在一个盘,构建输出在另一个盘
打开VirtualBox虚拟介质管理,创建一个新的硬盘,最好选择vmdk格式,因为这样可以直接被vmware识别
命名为android8sourceCompileOut.vmdk后一路next即可创建成功
根据行云流水地下载最小Android8源码),我们事先将源代码下载到android8source.vmdk中
虚拟机设置
磁盘添加
现在我们新建一个ubuntu18.04 server的虚拟机,并将上述两个磁盘添加到虚拟机中,如下图所示
虚拟机设置概览
前面提到一定要舍得给虚拟机分配cpu和内存,我的虚拟机设置参考如下:
挂载上述两个磁盘
执行·sudo fdisk -l
查看磁盘分布情况
可以看到/dev/sdb和/dev/sdc两个磁盘还没有挂载,现在我们将这两个磁盘分别挂载
// 建立源码磁盘挂载目录
sudo mkdir /media/android8source
// 建立编译输出磁盘挂载目录
sudo mkdir /media/android8sourceCompileOut
// 挂载源码磁盘到源码磁盘挂载目录
sudo mount /dev/sdb /media/android8source
// 挂载输出磁盘到输出磁盘挂载目录
sudo mount /dev/sdc /media/android8sourceCompileOut/
挂在磁盘的时候,你可能会收到如下错误
// 建立源码磁盘挂载目录
sudo mkdir /media/android8source
// 建立编译输出磁盘挂载目录
sudo mkdir /media/android8sourceCompileOut
// 挂载源码磁mount: /media/android8sourceCompileOut: wrong fs type, bad option, bad superblock on /dev/sdc, missing codepage or helper program, or other error.
原因所在的磁盘没有格式化,不能正常使用,执行命令sudo mkfs.ext4 /dev/sdc
后重新挂载即可
配置编译out目录
export OUT_DIR=/media/android8sourceCompileOut/out
源码编译
安装依赖
现在我们cd到源码根目录,根据设置 Linux 构建环境Ubuntu18.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
初始化
根据设置执行初始化操作
. build/envsetup.sh
收到如下报错
/bin/bash: python: command not found
解决办法是安装python,执行sudo apt install python
命令即可,之后执行python --version
命令确保版本是Python 2就行
python --version
Python 2.7.17
选择编译的系统
lunch aosp_arm-eng
开始编译
m -j6
出现如下错误
Failed to create intermediates directory: %v mkdir /media/android8sourceCompileOut/.microfactory_Linux_intermediates: permission denied
exit status 1
权限不够就使用root吧,执行如下命令
sudo bash
export OUT_DIR=/media/android8sourceCompileOut/out
. build/envsetup.sh
lunch aosp_arm-eng
m -j6
结果又出现错误
Failed to run java: exec: "java": executable file not found in $PATH
panic: Failed to run java: exec: "java": executable file not found in $PATH
缺少java环境,执行命sudo apt install openjdk-8-jdk
令把java8(切记:是java8,不要安装成其他java版本了,否则会出现奇奇怪怪的错误)安装上就行,我们再次执行m -j6
结果又出现错误
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
执行如下命令即可解决
cp /etc/java-8-openjdk/security/java.security /etc/java-8-openjdk/security/java.security.bak
sed -i 's/jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, /jdk.tls.disabledAlgorithms=/g' /etc/java-8-openjdk/security/java.security
jack-admin kill-server
jack-admin start-server
我们再次执行m -j6
大概20几分钟后又出现错误
FAILED: out/target/product/generic/obj/STATIC_LIBRARIES/libedify_intermediates/lexer.cpp
/bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -oout/target/product/generic/obj/STATIC_LIBRARIES/libedify_intermediates/lexer.cpp bootable/recovery/edify/lexer.ll"
flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' failed.
执行export LC_ALL=C
命令即可解决,我们再次执行m -j6
,大约1个半小时后又出现错误
FAILED: out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex
/bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
Out of memory error (version 1.3-rc7 'Douarn' (445000 d7be3910514558d6715ce455ce0861ae2f56925a by android-jack-team@google.com)).
Java heap space.
Try increasing heap size with java option '-Xmx<size>'.
执行如下命令即可解决
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
jack-admin kill-server
jack-admin start-server
我们再次执行m -j6
,就可以安静的等待编译完成,大概还需要需要1个小时,编译成功后如下图
最后编译输出结果占磁盘大小约54.6G
小结
整个编译流程下来,花费了3个多小时。
梳理一下之前的操作,如果想在一个新的环境中行云流水地编译源码,则需要执行如下操作
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
sudo apt install python openjdk-8-jdk
sudo cp /etc/java-8-openjdk/security/java.security /etc/java-8-openjdk/security/java.security.bak
sudo sed -i 's/jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, /jdk.tls.disabledAlgorithms=/g' /etc/java-8-openjdk/security/java.security
sudo mkdir /media/android8source
sudo mkdir /media/android8sourceCompileOut
sudo mount /dev/sdb /media/android8source
sudo mount /dev/sdc /media/android8sourceCompileOut/
sudo bash
export LC_ALL=C
export OUT_DIR=/media/android8sourceCompileOut/out
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
cd 到源代码根目录
. build/envsetup.sh
lunch aosp_arm-eng
m -j6
启动模拟器
现在我们执行emulator -show-kernel
命令,会有如下报错
emulator: WARNING: system partition size adjusted to match image file (2050 MB > 200 MB)
emulator: WARNING: cannot read adb public key file: /home/pick/.android/adbkey.pub
emulator: WARNING: encryption is off
QXcbConnection: Could not connect to display
Aborted (core dumped)
这是因为我们在ubuntu server环境中,而运行模拟器需要在ubuntu desktop环境中才行
新增一个ubuntu18.04 desktop虚拟机,并参考前面虚拟机设置中的磁盘添加将源码磁盘和编译输出磁盘添加到虚拟机
启动desktop虚拟机,将两个磁盘挂在到前面对应的目录中,执行前面小结中的命令,等待几分钟后即可看到编译成功提示
后执行emulator -show-kernel
命令即可启动模拟器。
到此,成功完成Android8源码并运行