1. 程式人生 > >Ubuntu16.04下載編譯Android6.0原始碼以及我所踩的坑

Ubuntu16.04下載編譯Android6.0原始碼以及我所踩的坑

說說我悽慘的經歷吧:先是看老羅的部落格,在虛擬機器裡面跑了個虛擬機器,預留了20G的空間,然後各種環境配不好(第一次玩Linux),弄了1day左右吧,終於開始下載了,還好祥哥這裡可以科學上網,省了一點功夫。然後還沒有寫指令碼(主要是不會啊!!!!),就苦逼的守在它下啊下。。。。因為它指不定的會出錯,需要repo sync。然後經過漫長的等待,本以為就等出了Success,結果等出了磁碟空間不足。。。。然後只有忍痛把東西都刪掉重頭來過,接著又給Ubuntu分配了90G的空間,想著一定能夠了,這次寫了指令碼,不用再苦逼的望著螢幕了。結果。。。結果。。下了88G+的時候又提示空間不足。說句真的,當時砸電腦的心都有了。然後在StackOverflow看見有人給了Google官方的下載指南,進去一看嚇我一跳,至少需要120G,我硬碟就500G,準備暫時放棄,先買個固態來著。。。但是不甘心啊!!!!

然後就看見了“梧桐那時雨”的部落格,再次感謝。

1 編譯環境

  • UbuntuKylin 16.04 LTS
  • Android 6.0_r1
  • Open JDK 7

2準備工作

(1) 下載Android 6.0原始碼.

注意:原始碼的存放路徑不能有中文,否則編譯到系統內建的apk的時候會報錯無法解析class.dex檔案

(2) 解壓原始碼,合併檔案。
下載完畢後,使用下面命令合併:

<pre name="code" class="plain">cat Android6_r1_*>Android6_r1

(3) 解壓原始碼。

tar -zxvf Android6_r1.tgz

解壓原始碼是個漫長的過程,解壓後會在當前目錄下生成一個mydroid的資料夾。

4 安裝依賴

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib 
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential  
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib 
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 
sudo lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">5 避免小坑</span>
在編譯過程中如果host的預設編輯器時clang的話機就會導致: recipe for target ' out/host/linux-x86/obj/lib/libart.so'failed.

所以在開始編譯之前需要把clang關掉,方法是在art/build/common_build.mk ,中找到WITHOUT_HOST_CLANG,關閉clang即可。

<pre name="code" class="plain">ifneq ($(WITHOUT_HOST_CLANG),true)

改為:

ifeq ($(WITHOUT_HOST_CLANG),false)

7 開始編譯

(1) 在 .bashrc檔案末尾新增:export USE_CCACHE = 1

echo export USE_CCACHE=1 >> ~/.bashrc
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">(2) 為了提高編譯效率,設定編譯器快取記憶體:</span>
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">prebuilts/misc/linux-x86/ccache/ccache -M 50G
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">(3) 接著匯入編譯Android原始碼所需的環境變數和其它引數:</span>
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">source build/envsetup.sh
<img src="https://img-blog.csdn.net/20160526152459216" alt="這裡寫圖片描述" title="" style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);" />

(4) 執行lunch命令選擇編譯目標:

lunch

這裡寫圖片描述

選擇1:
這裡寫圖片描述

(5) 開始編譯,執行make -j8, 8為同時編譯的執行緒數,一般google推薦這個數字為2倍的cpu個數再加上2,比如4核,就是10。

make -j8
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">關於cpu個數,可以用下面命令檢視:</span>
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"></span><pre name="code" class="plain">cat  /proc/cpuinfo
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">好了,開始編譯了.</span>

8 編譯成功

編譯成功後如下圖:


進入mydroid/out/target/product/generic目錄,可以看到編譯好的檔案:
這裡寫圖片描述

啟動模擬器:

emulator
<span style="font-size: 14px; font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">稍等一會,就可以出現開頭的模擬器畫面了:</span>


9 其他的一些問題

當我成功啟動之後,關機重來,試了試模組編譯,然後再啟動模擬器時,報錯:emulator:未找到命令 

解決辦法:

build/envsetup.sh
lunch 1

終於可以開始愉快的學習了:)