都2023了回俐,在下才嘗試下載Android8源碼并試圖編譯吹艇,本文將討論如何一步一步的編譯Android8源碼以及運行麦牺,遇到的問題也會給出搜索過后的解決辦法钮蛛。相信有緣人通過這篇文章能夠節(jié)省至少半天的時間,因為本文主打一個字:快剖膳!從而提升進(jìn)一步學(xué)習(xí)源碼的決心
本次源碼編譯將在虛擬機中進(jìn)行魏颓,其特點是要舍得給虛擬機分配cpu和內(nèi)存,否則奇奇怪怪的錯誤會找上門
根據(jù)官網(wǎng)設(shè)置 Linux 構(gòu)建環(huán)境的指示
我們采用ubuntu18.04來構(gòu)建吱晒,私以為跟著官方超甸饱,不會挨彎刀
本次編譯源碼的大前提大致有如下幾點
源碼和編譯輸出放到兩個不同的磁盤中,即將源代碼下載到android8source.vmdk中(源碼下載請參考行云流水地下載最小Android8源碼)仑濒,將編譯輸出放到android8sourceCompileOut.vmdk中
使得源碼編譯資源利用最大叹话,我決定源碼編譯在ubuntu18.04的server中進(jìn)行,運行模擬器的系統(tǒng)在ubuntu18.04的desktop中進(jìn)行
經(jīng)過編譯后墩瞳,我會將總結(jié)放到文末
編譯輸出磁盤創(chuàng)建
參考使用單獨的輸出目錄給出的建議驼壶,為加快編譯速度,我們將構(gòu)建輸出到另一個磁盤中喉酌,為此我們需要為虛擬機增加一塊新的硬盤热凹。以期達(dá)到源碼在一個盤,構(gòu)建輸出在另一個盤
打開VirtualBox虛擬介質(zhì)管理泪电,創(chuàng)建一個新的硬盤般妙,最好選擇vmdk格式,因為這樣可以直接被vmware識別
命名為android8sourceCompileOut.vmdk后一路next即可創(chuàng)建成功
根據(jù)行云流水地下載最小Android8源碼)相速,我們事先將源代碼下載到android8source.vmdk中
虛擬機設(shè)置
磁盤添加
現(xiàn)在我們新建一個ubuntu18.04 server的虛擬機碟渺,并將上述兩個磁盤添加到虛擬機中,如下圖所示
虛擬機設(shè)置概覽
前面提到一定要舍得給虛擬機分配cpu和內(nèi)存突诬,我的虛擬機設(shè)置參考如下:
掛載上述兩個磁盤
執(zhí)行·sudo fdisk -l
查看磁盤分布情況
可以看到/dev/sdb和/dev/sdc兩個磁盤還沒有掛載止状,現(xiàn)在我們將這兩個磁盤分別掛載
// 建立源碼磁盤掛載目錄
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.
原因所在的磁盤沒有格式化,不能正常使用怯疤,執(zhí)行命令sudo mkfs.ext4 /dev/sdc
后重新掛載即可
配置編譯out目錄
export OUT_DIR=/media/android8sourceCompileOut/out
源碼編譯
安裝依賴
現(xiàn)在我們cd到源碼根目錄浆洗,根據(jù)設(shè)置 Linux 構(gòu)建環(huán)境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
初始化
根據(jù)設(shè)置執(zhí)行初始化操作
. build/envsetup.sh
收到如下報錯
/bin/bash: python: command not found
解決辦法是安裝python,執(zhí)行sudo apt install python
命令即可集峦,之后執(zhí)行python --version
命令確保版本是Python 2就行
python --version
Python 2.7.17
選擇編譯的系統(tǒng)
lunch aosp_arm-eng
開始編譯
m -j6
出現(xiàn)如下錯誤
Failed to create intermediates directory: %v mkdir /media/android8sourceCompileOut/.microfactory_Linux_intermediates: permission denied
exit status 1
權(quán)限不夠就使用root吧伏社,執(zhí)行如下命令
sudo bash
export OUT_DIR=/media/android8sourceCompileOut/out
. build/envsetup.sh
lunch aosp_arm-eng
m -j6
結(jié)果又出現(xiàn)錯誤
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環(huán)境,執(zhí)行命sudo apt install openjdk-8-jdk
令把java8(切記:是java8塔淤,不要安裝成其他java版本了摘昌,否則會出現(xiàn)奇奇怪怪的錯誤)安裝上就行,我們再次執(zhí)行m -j6
結(jié)果又出現(xiàn)錯誤
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'
執(zhí)行如下命令即可解決
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
我們再次執(zhí)行m -j6
大概20幾分鐘后又出現(xiàn)錯誤
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.
執(zhí)行export LC_ALL=C
命令即可解決高蜂,我們再次執(zhí)行m -j6
聪黎,大約1個半小時后又出現(xiàn)錯誤
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>'.
執(zhí)行如下命令即可解決
export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
jack-admin kill-server
jack-admin start-server
我們再次執(zhí)行m -j6
,就可以安靜的等待編譯完成备恤,大概還需要需要1個小時稿饰,編譯成功后如下圖
最后編譯輸出結(jié)果占磁盤大小約54.6G
小結(jié)
整個編譯流程下來,花費了3個多小時露泊。
梳理一下之前的操作喉镰,如果想在一個新的環(huán)境中行云流水地編譯源碼,則需要執(zhí)行如下操作
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
啟動模擬器
現(xiàn)在我們執(zhí)行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環(huán)境中侣姆,而運行模擬器需要在ubuntu desktop環(huán)境中才行
新增一個ubuntu18.04 desktop虛擬機,并參考前面虛擬機設(shè)置中的磁盤添加將源碼磁盤和編譯輸出磁盤添加到虛擬機
啟動desktop虛擬機沉噩,將兩個磁盤掛在到前面對應(yīng)的目錄中捺宗,執(zhí)行前面小結(jié)中的命令,等待幾分鐘后即可看到編譯成功提示
后執(zhí)行emulator -show-kernel
命令即可啟動模擬器川蒙。
到此蚜厉,成功完成Android8源碼并運行