http://source.android.com/source/initializing.html 官網操做方法html
說明:本次是下載android4.4最新源碼並編譯的過程,java
環境:本次使用UbuntuKylin發佈的長期支持系統14.04python
前提條件:linux
1 系統:Linux/ Ubuntu / Mac OS == (2.3.x以上必須使用64位),至少30GB 的硬盤存儲空間,有可能達到100GB以上在編譯中,其中源碼下載後總共大約8.5GB ,android
2 網絡條件:有google賬號,國內容易被牆,因此。。。git
3 軟件環境:jdk,git,python,curl,make, ==github
電腦配置越好,速度也就越快了-_-!shell
1 . 使用ubuntu 10.04版本以上,對以android 2.3.x以上的版本,必須使用64位的環境,比較老的則能夠在32位環境下編譯。ubuntu
也能夠在虛擬機下編譯android,可是你的機器至少有16gb內存,這個就不大現實了吧,通常人的機器仍是沒那麼高配的,因此忽略不看。api
2.安裝JDK,最新的源碼編譯須要java7,固然也能夠用6版本,可是最新的老是有好處的,因此就用7.由於版權問題,推薦在ubuntu下安裝OpenJDK便可,固然也可使用標準oracle的JDK. 在終端下輸入 sudo apt-get install openjdk-7-jdk ,輸入密碼,一路yes安裝便可。
若是提提示成功,試下這個命令,那麼纔是真的成功了,
java -version
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.6) (7u51-2.4.6-1ubuntu4)
OpenJDK 64-Bit Server VM (build 24.51-b03, mixed mode)
sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
這裏安裝了一大批工具,可是可能會出錯,
根據這兩個出錯的分開單獨安裝,直至所有安裝成功爲止.(不一樣版本上須要安裝有些不一樣的,看官網)
生成軟鏈接
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1/usr/lib/i386-linux-gnu/libGL.so
在當前用戶目錄下找到.bashrc寫入 export USE_CCACHE=1
默認緩存目錄爲當前用戶下的.ccache目錄,通常使用默認便可,若是有特殊狀況則設置緩存目錄, export CCACHE_DIR=your_cache_dir
建議緩存大小爲50~100GB
當你下載玩所有源碼後執行這句 prebuilts/misc/linux-x86/ccache/ccache -M 50G
在4.0.x之前的 位置不一樣,則執行 這個 prebuilt/linux-x86/ccache/ccache -M 50G
只有下載徹底後才能執行,在你的源碼目錄下才有這個工具執行
默認下輸出目錄在你下載源碼的子目錄下 out
若是把輸出目錄設置爲另一個不一樣的盤,則編譯速度會快不少,
export OUT_DIR_COMMON_BASE=your_out_dir
新建一個目錄用於存放下載用到的工具
mkdir ~/bin 在當前用戶下新建一個bin目錄
PATH=~/bin:$PATH 使用臨時的path,能夠在.bashrc中寫入 下面這句永久生效
export PATH="$PATH:/home/user/bin/:." 沒個之間使用:分開,最後一個是.表示當前目錄
只要路徑設置好了,無論你走到哪一個目錄下都能執行路徑下的命令
你們都知道通常源碼是存放git上的,可是考慮到衆多的android分支及各個功能,那是有一大堆git等着你去clone啊,那還不是要你的命,所以google把這些git地址寫成了一個repo,其實裏面也就是那些git地址了,只不過方便咱們使用.
正常狀況下使用下面的這句
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
可是在china網絡就是喜歡抽風,當失敗時能夠試下這個
curl http://git-repo.googlecode.com/files/repo-1.19 > ~/bin/repo
(我是用這個獲得repo文件的, git clone https://gerrit.googlesource.com/git-repo )
把文件下載到bin目錄下,下載完成後 chmod a+x ~/bin/repo 增長可執行權限 ,能夠試一下 輸入repo命令,看輸出就知道成功沒.
獲取最新的版本 http://source.android.com/source/build-numbers.html 這裏查看最新的版本對應的名字
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2
出現了以下錯誤提示
別急,把你當前目錄下的.repoconfig刪除
rm -rf .repoconfig
https://android.googlesource.com/new-password 到這裏驗證一下你的身份,把獲得的以machine 兩行開始的 複製保存爲.netrc ,(有個點,表示爲隱藏的文件)保存到你的目錄下,
再次執行(中間加了個/a )
repo init -u https://android.googlesource.com/a/platform/manifest -b android-4.4.2_r2 (下載原生的android)
若是仍是提示什麼公鑰錯誤的話,那就多是那個repo的問題了,須要下載個最新的穩定版本,我就是這個搞得頭痛的
!-_- 用這個clone過來,而後把repo文件放到bin下, (git clone https://gerrit.googlesource.com/git-repo)
若是是下載CM11的話就用
cm_repo 下載,用法和上面的同樣,只是區分了命名而已,且這個不用那麼麻煩
cm_repo init -u git://github.com/CyanogenMod/android.git -b cm-11.0 (下載CM的源碼)
等待完成
先用這個腳本保存到前面那個bin目錄下,加執行權限
download.sh
#!/bin/bash
echo "======start repo sync======"
repo sync
while [ $? == 1 ]; do
echo "======sync failed, re-sync again======"
sleep 3
repo sync
done
用這個shell代替直接使用repo sync,這個網絡問題很容易出問題,須要不停的操做,因此這個shell就能夠解決問題了
能夠查看下載了那些,在咱們下載源碼的目錄下有個隱藏的文件夾 .repo
裏面就是存放了一大堆文件了(大可能是帶有.git的文件),等到下載徹底後它會自動把這些文件移動到咱們下載源碼的根目錄下,這時就能夠顯示所有內容了.
用上一天半天的時間,讓機子下載去吧.
...............................................
下載了一個晚上了,已經下載徹底了
下載完後能夠校驗一下
執行 gpg --import
而後把這個複製進去
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version:GnuPG v1.4.2.2(GNU/Linux)
mQGiBEnnWD4RBACt9/h4v9xnnGDou13y3dvOx6/t43LPPIxeJ8eX9WB+8LLuROSV
lFhpHawsVAcFlmi7f7jdSRF+OvtZL9ShPKdLfwBJMNkU66/TZmPewS4m782ndtw7
8tR1cXb197Ob8kOfQB3A9yk2XZ4ei4ZC3i6wVdqHLRxABdncwu5hOF9KXwCgkxMD
u4PVgChaAJzTYJ1EG+UYBIUEAJmfearb0qRAN7dEoff0FeXsEaUA6U90sEoVks0Z
wNj96SA8BL+a1OoEUUfpMhiHyLuQSftxisJxTh+2QclzDviDyaTrkANjdYY7p2cq
/HMdOY7LJlHaqtXmZxXjjtw5Uc2QG8UY8aziU3IE9nTjSwCXeJnuyvoizl9/I1S5
jU5SA/9WwIps4SC84ielIXiGWEqq6i6/sk4I9q1YemZF2XVVKnmI1F4iCMtNKsR4
MGSa1gA8s4iQbsKNWPgp7M3a51JCVCu6l/8zTpA+uUGapw4tWCp4o0dpIvDPBEa9
b/aF/ygcR8mh5hgUfpF9IpXdknOsbKCvM9lSSfRciETykZc4wrRCVGhlIEFuZHJv
aWQgT3BlbiBTb3VyY2UgUHJvamVjdCA8aW5pdGlhbC1jb250cmlidXRpb25AYW5k
cm9pZC5jb20+iGAEExECACAFAknnWD4CGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIX
gAAKCRDorT+BmrEOeNr+AJ42Xy6tEW7r3KzrJxnRX8mij9z8tgCdFfQYiHpYngkI
2t09Ed+9Bm4gmEO5Ag0ESedYRBAIAKVW1JcMBWvV/0Bo9WiByJ9WJ5swMN36/vAl
QN4mWRhfzDOk/Rosdb0csAO/l8Kz0gKQPOfObtyYjvI8JMC3rmi+LIvSUT9806Up
hisyEmmHv6U8gUb/xHLIanXGxwhYzjgeuAXVCsv+EvoPIHbY4L/KvP5x+oCJIDbk
C2b1TvVk9PryzmE4BPIQL/NtgR1oLWm/uWR9zRUFtBnE411aMAN3qnAHBBMZzKMX
LWBGWE0znfRrnczI5p49i2YZJAjyX1P2WzmScK49CV82dzLo71MnrF6fj+Udtb5+
OgTg7Cow+8PRaTkJEW5Y2JIZpnRUq0CYxAmHYX79EMKHDSThf/8AAwUIAJPWsB/M
pK+KMs/s3r6nJrnYLTfdZhtmQXimpoDMJg1zxmL8UfNUKiQZ6esoAWtDgpqt7Y7s
KZ8laHRARonte394hidZzM5nb6hQvpPjt2OlPRsyqVxw4c/KsjADtAuKW9/d8phb
N8bTyOJo856qg4oOEzKG9eeF7oaZTYBy33BTL0408sEBxiMior6b8LrZrAhkqDjA
vUXRwm/fFKgpsOysxC6xi553CxBUCH2omNV6Ka1LNMwzSp9ILz8jEGqmUtkBszwo
G1S8fXgE0Lq3cdDM/GJ4QXP/p6LiwNF99faDMTV3+2SAOGvytOX6KjKVzKOSsfJQ
hN0DlsIw8hqJc0WISQQYEQIACQUCSedYRAIbDAAKCRDorT+BmrEOeCUOAJ9qmR0l
EXzeoxcdoafxqf6gZlJZlACgkWF7wi2YLW3Oa+jv2QSTlrx4KLM=
=Wi5D
-----END PGP PUBLIC KEY BLOCK-----
而後 ctrl + D結束,提示成功導入
執行校驗 git tag -v TAG_NAME
最後看看下載後的大小
.repo 下佔用了 27.4GB,也就是源碼總共佔據了大約9GB左右,還好硬盤夠大,否則還真吃不消,這些還沒包括輸出的和緩存文件呢.按理來講那個.repo應該也沒那麼大啊,我只clone一個最新的版本啊,發現.repo/project-objects目錄很大,和咱們源碼跟目下同樣..
所有目錄
不要忘了,這是應該設置一下緩存大小!
1.初始化腳本 source build/envsetup.sh 或者
. build/envsetup.sh (注意.後面有空格)
2.開始編譯源碼,注意根據你的電腦cpu來選擇最佳的參數以獲得最快的編譯速度,N = 你的核心數乘以1或者2
個人是4核4線程的,我就用 make -j8
出現了一下的各類毛病
提示不能用OpenJDK編譯,這不是很奇葩麼,官網說了用的OpenJDK,到編譯這不就死了,仍是老老實實的裝上Oracle的JDK6吧,
而後又遇到了 OSError: [Errno 2] No such
file
or directory
make
: *** [
/home/odexcide/android-4
.
/out/target/product/generic/obj/GYP/shared_intermediates/ui/gl/jni/Surface_jni
.h]
GG了一下,找到答案了,須要設置一個javap的軟鏈接到/usr/bin/目錄下
再次make 而後又遇到了 Too many levels of symbolic links
刪除剛纔創建的軟鏈接,使用絕對路徑來創建軟鏈接
如今就等編譯完成了..~~
========================== 漫長時間=========================
大約過了1個小時,編譯完成了,聽說是第一次編譯時間比較久,果然如此,須要徹底編譯一遍,
最終生成的文件在 這裏 /source/out/target/product 能夠看到一些.img文件了.
這時直接執行emulator就能夠運行咱們編譯好的了,若是不當心關閉了前面使用的窗口則會不能使用
我就是這樣 ,由於編譯完後感受系統很慢,因此就註銷了一下,回來發現不能執行,GG之,應該是路徑問題致使的
因此從新設置編譯一下過程,時間很短(確保和前面編譯時選擇參數一致),沒有什麼改變的話編譯速度是很快的
.編譯完後就能夠執行 了
上結果圖
好了,編譯運行成功了,但這只是什麼都沒作的編譯,只適合nexus系列的手機,不適合咱們的X機,須要後面的加工才行.