[Android 編譯(一)] Ubuntu 16.04 LTS 成功編譯 Android 6.0 源碼教程

1 前言

通過3天奮戰,終於在Ubuntu 16.04上把Android 6.0的源碼編譯出來了,各類配置,各類error,各類爬坑,特寫此博客記錄爬坑經歷。先上圖,Ubuntu上編譯完後成功運行模擬器,如圖:html

這裏寫圖片描述

2 編譯環境

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

3 準備工做

(1) 下載android 6.0源碼.java

Androdi 6.0源碼下載地址: http://pan.baidu.com/s/1o6N86a2python

感謝下面這位博主上傳源碼,我也是從他的博客下載的源碼:linux

http://blog.csdn.net/ilittleone/article/details/6823441android

下載源碼請在Windows下面下載,迅雷不解釋。 
注意:源碼的存放路徑不能有中文,不然編譯到系統內置的apk的時候會報錯沒法解析class.dex文件git

(2) 解壓源碼,合併文件。 
下載完畢後,使用下面命令合併:程序員

cat Android6_r1_*>Android6_r1.tgz
  •  

合併完後,使用下面命令校驗hash:ubuntu

md5sum Android6_r1.tgz
  •  

此時會生成一個hash串,如圖:windows

這裏寫圖片描述

對比你下載的文件裏面的hash.txt,若是一致那麼繼續,不一致則文件損壞,從新下載。緩存

(3) 解壓源碼。

tar -zxvf Android6_r1.tgz

解壓源碼是個漫長的過程,解壓後會在當前目錄下生成一個mydroid的文件夾。若是你發現源碼的路徑有中文,須要移動源碼,請複製壓縮包,而後再使用命令解壓,而不要直接複製解壓後的文件夾

(4) 安裝Ubuntu 16.04 
編譯Android源碼最好直接安裝Linux,不要使用虛擬機,編譯源碼是個漫長的過程,虛擬機要十幾個小時,博主直接在電腦上裝Ubuntu,編譯只須要3個小時。實體機可避免虛擬機的不少問題,例如:磁盤空間不足,內存不夠等等。更重要的是,編譯源碼是個不斷爬坑的過程,實體機能夠很快的遇到錯誤,而後解決問題,繼續編譯,再次遇到錯誤,而虛擬機這個週期會很漫長,於是浪費大量時間。實體機解壓速度也比虛擬機快得多。Ubuntu與windows兼容作的很好,能夠直接把Ubuntu看成一個windows程序安裝,也能夠單獨安裝,若是單獨安裝請務必給/home分區分配至少120G空間,由於編譯後的Android系統真的很大。 
強烈建議下載Ubuntu鏡像,而後使用軟碟通刻錄到U盤,經過U盤把Ubuntu安裝到物理機器上。

(5) Ubuntu安裝教程參考下面連接,Ubuntu 16.04安裝方法也是同樣的 :

http://jingyan.baidu.com/article/59703552e0a6e18fc007409f.html

(6) 再次聲明:轉載請註明來自」梧桐那時雨」的博客:http://blog.csdn.net/fuchaosz/article/details/51487585

4 更換軟件源爲阿里雲

爲了更快的安裝軟件,咱們須要更換軟件源爲國內的軟件源,這裏推薦使用Ubuntu官方指定的國內軟件源阿里雲,博主以前使用的是網易的軟件源,結果發現OpenJDK7裝不上去,因而換成了阿里的,具體方法是:

sudo gedit /etc/apt/sources.list
  •  

在文件最前面加入下面代碼:

deb http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ quantal-backports main restricted universe multiverse

5 安裝依賴

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 libc6-dev-i386 
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev 
sudo apt-get install lib32z-dev ccache
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4

Ubuntu 16.04請務必使用上面的依賴,Ubuntu 16.04須要的依賴和Ubuntu 14.04所須要的依賴是不一樣的,博主照着Ubuntu 14.04的依賴結果掉進大坑,詳見後面的編譯過程記錄.

6 安裝open JDK7

從Android 6.0開始Android源碼的編譯須要安裝OpenJDK,不能使用Oracle JDK,並且Android 6.0只能使用OpenJDK7,以下圖:

這裏寫圖片描述

因爲Ubuntu 16.04沒有OpenJDK7的源,所以在16.04上安裝OpenJDK7須要執行下面的命令:

sudo add-apt-repository ppa:openjdk-r/ppa 
sudo apt-get update
sudo apt-get install openjdk-7-jdk
  •  

配置OpenJDK.打開/etc/profile文件:

sudo gedit /etc/profile
  •  

在末尾追加下面代碼:

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64
export JRE_HOME=${JAVA_HOME}/jre 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib 
export PATH=${JAVA_HOME}/bin:$PATH
  •  

修改了/etc/profile文件須要重啓才能生效,但使用下面命令能夠在不重啓的狀況下在當前bash環境生效:

source /etc/profile
  •  

檢查OpenJDK配置是否正確:

java -version
  •  

配置正確則以下圖:

這裏寫圖片描述

7 修改源碼

修改 mydroid/art/build/Android.common_build.mk 文件,定位到75行,將下面的代碼:

ifneq ($(WITHOUT_HOST_CLANG),true)
  •  

改成:

ifeq ($(WITHOUT_HOST_CLANG),false)
  •  

若是不修改這裏,會遇到一個比較棘手的編譯錯誤,修改的目的是把CLANG這個編譯選項關掉,詳見後面的編譯記錄,百度搜狗都無解,這個錯誤只會在Ubuntu16.04上遇到,Ubuntu14.04則不存在這個問題,解決這個編譯錯誤花費一天時間,還好咱英語好,在歪果人的論壇上看了幾篇帖子,終於搞定了。這裏順便說一下小技巧: 
遇到編譯錯誤,請把error後面的錯誤信息所有複製,而後用搜狗搜英文網頁,不要用百度那個渣渣

8 開始編譯

(1) 在 .bashrc文件末尾添加:export USE_CCACHE = 1

echo export USE_CCACHE=1 >> ~/.bashrc
  •  

(2) 爲了提升編譯效率,設置編譯器高速緩存:

prebuilts/misc/linux-x86/ccache/ccache -M 50G
  •  

(3) 接着導入編譯Android源碼所需的環境變量和其它參數:

source build/envsetup.sh
  •  

這裏寫圖片描述

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

lunch
  •  

這裏寫圖片描述

選擇1: 
這裏寫圖片描述

(5) 開始編譯,執行make -j8, 8爲同時編譯的線程數,通常google推薦這個數字爲2倍的cpu個數再加上2,好比4核,就是10。博主使用的是8:

make -j8
  •  

關於cpu個數,能夠用下面命令查看:

cat  /proc/cpuinfo
  •  

好了,開始編譯了,接下來就是不斷error,不斷修復,繼續編譯的過程,下面記錄個人爬坑經歷

9 編譯記錄

我是參照下面這篇文章開始編譯的:

http://www.linuxidc.com/Linux/2016-01/127292p2.htm

若是一路順風,我也就用不着寫這篇博客了,然而他用的是Ubuntu14.04,我用的最新的Ubuntu16.04,按照上面這篇博文,遇到不少坑,這裏記錄如下爬坑經歷: 
(1) 依賴不一樣。Ubuntu 14和16的依賴選項是不一樣的: 
這裏寫圖片描述

因而將libsdl1.2-dev改成libsdl-dev,將mingw32去掉

(2) JDK配置錯誤。 
先用oracle JDK8報下面錯: 
這裏寫圖片描述

改成Oracle JDK7報下面錯: 
這裏寫圖片描述 
後改成OpenJDK7解決問題。

(3) 大坑。接着遇到下面錯誤: 
這裏寫圖片描述

仔細看錯誤:

clang: error: linker command failed with exit code
  •  

其實這個是系統使用clang編輯器報的錯,百度了一下,解決方法通常是將art/build/Android.common_build.mk文件ifneq ($(WITHOUT_HOST_CLANG),true)改成ifeq ($(WITHOUT_HOST_CLANG),false) 
然而紙上得來終覺淺,絕知此事要躬行,由於,這並無什麼卵用,至少如今沒有卵用。不信,請看下面的帖子:

http://ask.csdn.net/questions/253318

我試了一下,也沒用,仍是沒解決問題,好像這個是新系統的兼容問題,百度搜狗一天,沒有進展,後來發現了下面這篇帖子,也是14.04編譯Android6.0的:

http://blog.csdn.net/lewif/article/details/49762993

抱着反正無聊試一試的想法,把上面這篇帖子中的依賴一通複製(因此最終用的依賴是兩篇帖子加起來的依賴):

sudo apt-get install git-core gnupg flex bison gperf build-essential \ 
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \ 
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \ 
libgl1-mesa-dev libxml2-utils xsltproc unzip m4
  •  

而後make clean,從新再來,接着就睡覺去了。 
一覺醒來,而後……..你覺得我就編粗來了?呵呵,這個錯誤是終於編過去了,但是又遇到下面的錯誤: 
這裏寫圖片描述

解決這個錯誤,又花費一番力氣,在歪果人的論壇上看到下面這篇帖子:

http://forum.xda-developers.com/chef-central/android/guide-how-to-setup-ubuntu-16-04-lts-t3363669/page2

注意看這個帖子的15樓,哈哈,這個時候找到解決方法了,再修改art / build/Android.common_build.mk文件

ifneq ($(WITHOUT_HOST_CLANG),true)
  •  

改成:

ifeq ($(WITHOUT_HOST_CLANG),false)
  •  

從新編譯,解決問題。

(4) 中文路徑,坑。 
這裏寫圖片描述

遇到這個問題也是很難百度到,哎,最後把源碼換到了全英文的路徑下面,解決這個問題。注意移動源碼的時候不要直接複製mydroid文件夾,一個小時都複製不完,因此正確的方法是複製壓縮包,而後再解壓一遍。 
接下來就編譯成功了。

10 編譯成功

編譯成功後以下圖: 
這裏寫圖片描述

進入mydroid/out/target/product/generic目錄,能夠看到編譯好的文件: 
這裏寫圖片描述

啓動模擬器:

emulator
  •  

稍等一會,就能夠出現開頭的模擬器畫面了,哈哈,打完收工。

11 附錄:Ubuntu 16.04編譯ROM英文教程

最後,附上在看帖子的時候發現的,在Ubuntu16.04上編譯AOSP、CyanogenMod的教程,固然是英文的啦:

http://forum.xda-developers.com/chef-central/android/guide-how-to-setup-ubuntu-16-04-lts-t3363669

12 總結

Android系統源碼的編譯就是不斷和各類error作鬥爭的過程,考驗程序員獲取信息的能力,遇到error的時候只能各類百度搜狗,但這也是很是鍛鍊能力的過程,博主在編譯過程當中最大的體會就是:英語必定要好,哈哈。若是你成功編譯出來了,或者編譯遇到問題,歡迎給我留言

相關文章
相關標籤/搜索