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
終於可以開始愉快的學習了:)