AOSP編譯:2023從零開始編譯Android8源碼

都2023了回俐,在下才嘗試下載Android8源碼并試圖編譯吹艇,本文將討論如何一步一步的編譯Android8源碼以及運行麦牺,遇到的問題也會給出搜索過后的解決辦法钮蛛。相信有緣人通過這篇文章能夠節(jié)省至少半天的時間,因為本文主打一個字:快剖膳!從而提升進(jìn)一步學(xué)習(xí)源碼的決心

本次源碼編譯將在虛擬機中進(jìn)行魏颓,其特點是要舍得給虛擬機分配cpu和內(nèi)存,否則奇奇怪怪的錯誤會找上門

根據(jù)官網(wǎng)設(shè)置 Linux 構(gòu)建環(huán)境的指示

設(shè)置 Linux 構(gòu)建環(huán)境

我們采用ubuntu18.04來構(gòu)建吱晒,私以為跟著官方超甸饱,不會挨彎刀

本次編譯源碼的大前提大致有如下幾點

  1. 源碼和編譯輸出放到兩個不同的磁盤中,即將源代碼下載到android8source.vmdk中(源碼下載請參考行云流水地下載最小Android8源碼)仑濒,將編譯輸出放到android8sourceCompileOut.vmdk中

  2. 使得源碼編譯資源利用最大叹话,我決定源碼編譯在ubuntu18.04的server中進(jìn)行,運行模擬器的系統(tǒng)在ubuntu18.04的desktop中進(jìn)行

  3. 經(jīng)過編譯后墩瞳,我會將總結(jié)放到文末

編譯輸出磁盤創(chuàng)建

參考使用單獨的輸出目錄給出的建議驼壶,為加快編譯速度,我們將構(gòu)建輸出到另一個磁盤中喉酌,為此我們需要為虛擬機增加一塊新的硬盤热凹。以期達(dá)到源碼在一個盤,構(gòu)建輸出在另一個盤

打開VirtualBox虛擬介質(zhì)管理泪电,創(chuàng)建一個新的硬盤般妙,最好選擇vmdk格式,因為這樣可以直接被vmware識別

創(chuàng)建虛擬硬盤

命名為android8sourceCompileOut.vmdk后一路next即可創(chuàng)建成功

根據(jù)行云流水地下載最小Android8源碼)相速,我們事先將源代碼下載到android8source.vmdk中

虛擬機設(shè)置

磁盤添加

現(xiàn)在我們新建一個ubuntu18.04 server的虛擬機碟渺,并將上述兩個磁盤添加到虛擬機中,如下圖所示

虛擬硬盤添加

虛擬機設(shè)置概覽

前面提到一定要舍得給虛擬機分配cpu和內(nèi)存突诬,我的虛擬機設(shè)置參考如下:

虛擬機設(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磁盤情況

啟動desktop虛擬機沉噩,將兩個磁盤掛在到前面對應(yīng)的目錄中捺宗,執(zhí)行前面小結(jié)中的命令,等待幾分鐘后即可看到編譯成功提示

重新編譯成功

后執(zhí)行emulator -show-kernel命令即可啟動模擬器川蒙。

模擬器啟動中
模擬器啟動成功

到此蚜厉,成功完成Android8源碼并運行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市派歌,隨后出現(xiàn)的幾起案子弯囊,更是在濱河造成了極大的恐慌痰哨,老刑警劉巖胶果,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斤斧,居然都是意外死亡早抠,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門撬讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕊连,“玉大人悬垃,你說我怎么就攤上這事「什裕” “怎么了尝蠕?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長载庭。 經(jīng)常有香客問我看彼,道長,這世上最難降的妖魔是什么囚聚? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任靖榕,我火速辦了婚禮,結(jié)果婚禮上顽铸,老公的妹妹穿的比我還像新娘茁计。我一直安慰自己,他們只是感情好谓松,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布星压。 她就那樣靜靜地躺著,像睡著了一般毒返。 火紅的嫁衣襯著肌膚如雪租幕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天拧簸,我揣著相機與錄音劲绪,去河邊找鬼。 笑死盆赤,一個胖子當(dāng)著我的面吹牛贾富,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播牺六,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼颤枪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了淑际?” 一聲冷哼從身側(cè)響起畏纲,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎春缕,沒想到半個月后盗胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡锄贼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年票灰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡屑迂,死狀恐怖浸策,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惹盼,我是刑警寧澤庸汗,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站手报,受9級特大地震影響夫晌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜昧诱,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一晓淀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧盏档,春花似錦凶掰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至稚配,卻和暖如春畅涂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背道川。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工午衰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冒萄。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓臊岸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尊流。 傳聞我的和親對象是個殘疾皇子帅戒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容