作為一名合格的android開發人員,怎麼能不會編譯android源碼呢!一定要來一次說編譯就編譯的旅程,否則你的人生是不完整的!好,那麼我們進入正題!
本次編譯環境採用Ubuntu16.04LTE,android源碼選擇android6.0!官方建議採用Ubuntu14版本,主要是我剛開始沒在意系統版本,然後就直接下載安裝16.04版本了,然後也懶得換了,所以就選擇了這個版本....下面我們進入正題。
一、搭建Ubuntu環境。
去Ubuntu官網下載系統鏡像,虛擬機器可以用VMware Fusion,當然也可以用virtual box等等,這個沒影響的。具體安裝教程網上多的是,本文就不囉嗦了...
系統裝好之後就是配置java環境,本人親測,Oracle JDK8和open JDK9無法編譯,這兩個坑大家一定要注意....編譯的時候報錯提示使用open jdk 1.7.x....好,那麼java環境就是open jdk1.7了,這個坑大家就不要踩了...
openjdk1.7的安裝命令:
- $ sudo add-apt-repository ppa:openjdk-r/ppa
- $ sudo apt-get update
- $ sudo apt-get install openjdk-7-jdk
不要忘了環境變數的配置,如果java -version可以查看到當前的版本資訊,說明環境就配置好了。
二、下載系統源碼
源碼的下載網上有很多是說用git+repo方式下載的,但是很多請求都已經無法訪問了...牆的強大是無法直視的,所以我選擇了放棄。我用的是下面這位大神提供的百度雲,連結奉上http://blog.csdn.net/ilittleone/article/details/6823441。全部下載下來大概7個G左右,下載完了之後需要合并資源檔,總共10個資源檔,其中有個hash.txt是用來驗證md5資訊的,可以選擇忽略。將下載下來的這10個檔案放到統一檔案夾裡,然後在命令列裡進入此檔案夾,執行命令cat Android6_r1_*>android6.tgz
執行成功後你會發現當前檔案夾裡已產生android6.tgz壓縮包,解壓後即可得到android6.0的源碼。好,下面我們就進入源碼編譯環節
三、編譯源碼的依賴配置
ubuntu12/14/16所需要的依賴包都是不同的,版本不對應的話依賴包是安裝不成功的。
命令如下:
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
四、開始編譯
命令列裡進入源碼目錄,然後執行以下命令:
$ source build/envsetup.sh
$ lunch aosp_arm-eng
$ make -j8 (這裡的數字是根據系統配置來的,比如2核2線程的就可以選擇j4,數字越高編譯越快,前提你的電腦硬體要支援。。。)
然後就進入漫長的源碼編譯了...由於我在編譯的過程中遇到了很多坑,所以整天都在編譯。。。睡覺前大概是11點我選擇了最後一次嘗試。。。然後就睡覺了,醒來的時候發現終於編譯成功了,一行希望的綠色提示如下:
### makecompleted successfully (05:08:19 (hh:mm:ss))###
五、編譯過程中遇到的錯誤。這裡一定要看!
1 make:***[out/host/linux-x86/obj/lib/libart.so]Error 1,如:
解決方案:
編譯之前建議先修改源碼檔案裡的此檔案:art/build/Android.common_build.mk裡的內容
ART_HOST_CLANG := false
ifneq ($(WITHOUT_HOST_CLANG),true)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
修改為
ART_HOST_CLANG := false
ifeq ($(WITHOUT_HOST_CLANG),false)
# By default, host builds use clang for better warnings.
ART_HOST_CLANG := true
endif
2make: *** [out/target/common/docs/api-stubs-timestamp] 錯誤 45
解決辦法:
make clean
make update-api
make
3 編譯完成後直接emulator即可運行剛編譯成功的系統,但是我們退出當前命令列之後,再重新進來使用此命令會報找不到此命令的錯誤
解決方案:
進入源碼目錄
source build/envsetup.sh
lunchaosp_arm-eng
然後就可以執行emulator了
六、總結
本次編譯總體來說還是順利的,一天的時間就搞定了...主要是我這網速快,下載系統鏡像和andorid源碼都是兩三M每秒...書寫此文的目的在於記錄自己本次的經曆,也希望能給想研究系統編譯的人一點協助!
下面是本次編譯參考的文章,感謝各位大神的經驗!
http://blog.csdn.net/u010856630/article/details/51678745http://blog.csdn.net/chouretang/article/details/43769839http://blog.csdn.net/ddk3001/article/details/51454055