終於成功把Android 6.0 r1源碼的源碼編譯。先上圖,這是在Ubuntu中運行的Android模擬器:python
因爲我是在Win8中安裝虛擬機VMware,而後在虛擬機中安裝Ubuntu進行編譯,因此遇到諸多麻煩。若是直接在Linux中編譯,可能會更順利。linux
--------------------------------------------------------------------------------------------------------------------------android
準備工做:git
VMware虛擬機,安裝請參考:VMware8安裝配置Win七、CentOS-7嚮導 http://www.linuxidc.com/Linux/2016-01/127188.htmgithub
官網下載Ubuntu鏡像:ubuntu-14.04.3-desktop-amd64.isoshell
安裝ubuntu,一併參考「VMware8安裝配置Win七、CentOS-7嚮導」ubuntu
-----------------------------------------------------------------------------windows
建議:ubuntu內存分配4G,預留90G虛擬硬盤(以前選擇了默認的20G,在解壓tgz的時候直接報空間不足),網絡選擇「Bridged」方式。緩存
爲了編譯Android源碼,下面對安裝好的ubuntu做一些配置工做。
首先調出終端,用如下快捷鍵
Ctrl + Alt + T
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev libsdl-dev libesd0-dev
上面紅色部分是數字「1」。固然,你也能夠分開執行這些安裝命令。
若是沒有這些依賴組件,可能會遇到相似這樣的錯誤:
首先用如下命令搜索JDK版本
apt-cache search openjdk
執行安裝
sudo apt-get install openjdk-7-jdk
查看是否安裝成功
java -version
直接運行
echo $JAVA_HOME
並不能看到輸出。
設置:
echo export JAVA_HOME="/usr/lib/jvm/java-7-openjdk-amd64/" >> ~/.bashrc
而後重啓terminal或經過使用如下命令
source ~/.bashrc
此時從新輸入$JAVA_HOME,就能夠看到配置好的路徑了
這個有什麼用呢?利用Xshell方便咱們在windows和虛擬機中操做文件。Ubuntu缺省下是沒有安裝SSH Server,Client卻是爲咱們裝好了。
不知道怎麼用Xshell的,請看
Xshell 登陸 CentOS 6.3 中文亂碼的解決 http://www.linuxidc.com/Linux/2013-06/86600.htm
VirtualBox4.12文本安裝CentOS 5.4以及Xshell鏈接教程 PDF http://www.linuxidc.com/Linux/2013-06/85575.htm
Xshell鏈接CentOS6.5 iptables或ls 輸出亂碼 http://www.linuxidc.com/Linux/2014-06/103725.htm
VMware Linux使用Xshell登錄 http://www.linuxidc.com/Linux/2012-06/62546.htm
使用Xshell密鑰認證機制遠程登陸Linux http://www.linuxidc.com/Linux/2015-03/114947.htm
sudo apt-get install openssh-server
重啓它
sudo /etc/init.d/ssh restart
在百度雲盤上共享了Android6_r1的源碼,請下載:Android 6.0 r1分卷源碼 http://www.linuxidc.com/Linux/2016-01/127285.htm
此辦法笨了點。利用Xshell其實挺快的。直接拖進來。
監測文件Hash,看是否有損壞。具體對應什麼字符串請對照hash.txt
md5sum Android6_r1_aa
而後把這幾個文件合併成一個
cat Android6_r1_* > M.tgz
計算合併後的文件哈希
md5sum M.tgz
更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2016-01/127292p2.htm
tar zxvf M.tgz
這是個漫長的過程。
這個解壓命令會建立mydroid文件夾,解壓的東東都在裏面
在 .bashrc文件中添加:export USE_CCACHE = 1,操做以下:
echo export USE_CCACE=1 >> ~/.bashrc
爲了提升編譯效率,設置編譯器高速緩存。執行如下命令:
prebuilts/misc/linux-x86/ccache/ccache -M 30G
-M 30G 兩個參數表示設置30G大小的空間做爲緩存,這個數值能夠根據本身的硬盤空間大小繼續調整
接着導入編譯Android源碼所需的環境變量和其它參數,運行如下命令
source build/envsetup.sh
運行lunch命令選擇編譯目標
lunch
好比選擇1,會出現如下提示信息,告訴咱們編譯的源碼的一些相關信息
make -j8
由於筆記本是i5 4210u,因此使用8(CPU核心的兩倍),此處可能設置過大了。
看來並非一路順風啊,出問題了。開始我還覺得JDK版本不對,進入build/core/main.mk
發現默認就是1.7。
錯誤中止在下面的地方:
上面提過了,一開始我也沒安裝這些依賴組件,致使了一些沒必要要的麻煩。
還有其它常見編譯錯誤,已經有人整理出來了,適合的就參考如下吧:
一、編譯Android源碼致命錯誤解決方案 http://www.linuxidc.com/Linux/2016-01/127187.htm
二、編譯Android系統源碼和內核源碼 http://www.linuxidc.com/Linux/2016-01/127291.htm
繼續編譯
make -k
用了make -k以後,就悲劇了,編譯了一個晚上還沒好。
早上起來的時候果斷用「Ctrl + C」中斷編譯,從新安裝以上的依賴包,接着作清理工做
make clean
而後繼續開始,多加個sudo,由於以前的編譯輸出了「沒有權限操做」相似的提示。
sudo make -j8
大約兩個小時後,硬盤利用率100%,一直沒動。編譯也彷佛停住了。一個小時後,貌似掛了T~T
難道高速緩存佔用太多硬盤空間?虛擬機給的空間不夠?
好吧,我從新裝一個Ubuntu。而後分配60G的虛擬空間,2G內存,20G編譯高速緩存。又跑一個晚上。
次日一看,又是error,真是淚流滿面!
arm-linux-androideabi-g++: Internal compiler error: Killed (program cc1plus)
這是什麼鬼?
經過命令build-essential,g++我也裝了呀。
google了一下,有一個bug report:Build #478 Failed,但是沒看到解答。
看到stackoverflow上一個相似問答:arm-linux-androideabi-gcc: Internal error: Killed (program cc1) from Android NDK r8
整理幾個答案:
This error went away for me when I used "make" instead of the recommended "make -j4".
But rebooting the virtual machine seems to fix the problem for me. // are you sure??
For those having this issue with VMs, the solution that worked for me was bumping up the base memory. It was originally set to 512MB to 1536MB.
但是這是gcc呀。
而後又找到這個:firefox build for Android fails,裏面提到:
well the problem was caused by too little RAM allocated to my VM. Upped the RAM from 1Gb to 4Gb and the compile is now proceeding nicely.
真是RAM小了?
再試試吧。因爲機器配置緣由,最多好像只能給虛擬機分配3G的內存。而後直接sudo make執行命令。
抓狂啊!!難道ARM還小了?
重裝ubuntu再來。此次分配90G硬盤空間,4G內存(開始我還覺得只能給3G)。
最終使用如下編譯命令
sudo make -j2
從上午11點半左右開始執行,晚上10點回來,看到竟然編譯成功了!看到system.img沒有?哈哈~
進入目錄/out/target/product/generic,能夠看到ramdisk.img, system.img, userdata.img, cache.img這四個鏡像文件
因爲剛剛編譯成功,若是此時還沒有退出終端的話,能夠直接啓用命令運行Android模擬器。
emulator
若是退出了先前編譯的終端命令行窗口,那麼運行模擬器就徹底不同了。
若是對你有用,請支持一下~
參考:
在Ubuntu上下載、編譯和安裝Android最新源代碼 http://www.linuxidc.com/Linux/2011-06/37781.htm
Android 4.4源碼編譯 http://www.linuxidc.com/Linux/2015-01/112628.htm
更多Ubuntu相關信息見Ubuntu 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=2
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11