AOSP编译:2023从零开始编译Android8源码

都2023了,在下才尝试下载Android8源码并试图编译,本文将讨论如何一步一步的编译Android8源码以及运行,遇到的问题也会给出搜索过后的解决办法。相信有缘人通过这篇文章能够节省至少半天的时间,因为本文主打一个字:快!从而提升进一步学习源码的决心

本次源码编译将在虚拟机中进行,其特点是要舍得给虚拟机分配cpu和内存,否则奇奇怪怪的错误会找上门

根据官网设置 Linux 构建环境的指示

设置 Linux 构建环境

我们采用ubuntu18.04来构建,私以为跟着官方超,不会挨弯刀

本次编译源码的大前提大致有如下几点

  1. 源码和编译输出放到两个不同的磁盘中,即将源代码下载到android8source.vmdk中(源码下载请参考行云流水地下载最小Android8源码),将编译输出放到android8sourceCompileOut.vmdk中

  2. 使得源码编译资源利用最大,我决定源码编译在ubuntu18.04的server中进行,运行模拟器的系统在ubuntu18.04的desktop中进行

  3. 经过编译后,我会将总结放到文末

编译输出磁盘创建

参考使用单独的输出目录给出的建议,为加快编译速度,我们将构建输出到另一个磁盘中,为此我们需要为虚拟机增加一块新的硬盘。以期达到源码在一个盘,构建输出在另一个盘

打开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磁盘情况

启动desktop虚拟机,将两个磁盘挂在到前面对应的目录中,执行前面小结中的命令,等待几分钟后即可看到编译成功提示

重新编译成功

后执行emulator -show-kernel命令即可启动模拟器。

模拟器启动中
模拟器启动成功

到此,成功完成Android8源码并运行

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容