最近閑來無事,就想編譯一下android源碼折騰折騰。過程還算順利,編譯源碼用了近3小時,編譯sdk用了近30分鐘。關于為什么要編譯4.4的源碼,而不編譯5.0、6.0的源碼,一是正好筆記本中有下載好的4.4源碼;二是一些源碼學習的資料大都是4.x、2.x的源碼,而且4.4系統(tǒng)也是現(xiàn)在市場占有率最大的;三是基于4.4的源碼編譯,出現(xiàn)問題易于解決,因為大家都遇到過嘛(嘿嘿!)。
當然類似的文章教程很多,我主要是記錄自己編譯源碼的過程以及遇到的一些問題,方便自己以后查看。
資源下載:ubuntu12.04系統(tǒng)、android4.4源碼、jdk1.6.0_35、kernel源碼
一.編譯環(huán)境:
1.ubuntu12.04(64bit)
2.android4.4源碼(無.repo文件及kernel源碼)
注:沒有.repo也能編譯
a.壓縮包大小:
b.解壓后大?。?/p>
c.編譯源碼及sdk后文件大小
我的虛擬機64G的空間只剩下6.1G可用了>_< , 簡友們要留足空間??!
d.編譯后android4.4文件目錄:
3.java版本
二.編譯源碼,得到system.img
1.安裝java
安裝位置:
設置java環(huán)境變量:
export JAVA_HOME=/usr/local/java/jdk1.6.0_35
export JRE_HOME=/usr/local/java/jdk1.6.0_35/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
使用以下命令,就可以使用gedit打開etc目錄下的profile文件添加環(huán)境變量
$ sudo gedit /etc/profile
2.安裝編譯所需的包
注:大家先把這些包安裝上,編譯基本不會遇到問題,會很順利。
sudo apt-get install git git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install lib32z-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown
sudo apt-get install libxml2-utils xsltproc gcc-multilib lib32readline5-dev
3.開始編譯 ,源碼的位置及命令如下圖:
$ source build/envsetup.sh
$ make (也可以使用 make -j4 四線程編譯)
注:我使用的是make,沒有加-jx ,用了三個小時,主要是我用的是虛擬機,不敢開太多的線程去編譯,怕燒壞電腦_,下圖是我的電腦編譯源碼的時候cpu的使用率,大部分時間在100%,有時會跳到200%
4.編譯過程也不是一帆風順,我遇到了第一個錯誤,如下
Traceback (most recent call last):
File "frameworks/compile/libbcc/tools/build/gen-build-info.py", line 154, in <module>
main()
File "frameworks/compile/libbcc/tools/build/gen-build-info.py", line 111, in main
build_rev = get_repo_revision(repo_dir)
File "frameworks/compile/libbcc/tools/build/gen-build-info.py", line 39, in get_repo_revision
cwd=repo_dir)
File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libbcc_intermediates/BuildInfo.cpp] Error 1
make: *** Deleting file `out/host/linux-x86/obj/SHARED_LIBRARIES/libbcc_intermediates/BuildInfo.cpp'
知道為什么嗎?居然是git沒有安裝,暈... ,下面安裝git
$ sudo apt-get install git
5.git安裝好了,執(zhí)行make,繼續(xù)編譯,等啊等... ,時間過去了2個多小時,迎來了第二個錯誤,囧... ,如下
Notice file: system/extras/timeinfo/NOTICE -- out/target/product/generic/obj/NOTICE_FILES/src//system/xbin/timeinfo.txt
Install: out/target/product/generic/system/xbin/timeinfo
Copy xml: out/target/product/generic/system/etc/apns-conf.xml
/bin/bash: xmllint: command not found
make: *** [out/target/product/generic/system/etc/apns-conf.xml] Error 127
網(wǎng)上搜了搜,原因是少了libxml2-utils,安裝libxml2-utils,如下
$ sudo apt-get install libxml2-utils
注:這只是我編譯中遇到的一些問題,我已經(jīng)在上面第二步的命令中補上了git和libxml2-utils,所以按照我的這個教程編譯就不會再出現(xiàn)這兩個問題了,不過也可能會遇到其他問題,畢竟每個人電腦的環(huán)境不可能完全一樣。
6.耶!編譯終于完成,看看我的編譯完成界面截圖
生成system.img所在目錄:
7.ok,到這一步源碼編譯已經(jīng)完成,我們可以運行模擬器了,如果我們上圖的命令界面還在,可以直接輸入命令 emulator,如下圖:
$ emulator
如果這個界面關了,也沒關系,可以運行如下這些命令:
$ source build/envsetup.sh
$ lunch sdk-eng
$ emulator
到這里模擬器成功啟動,如下
三.編譯sdk
1.運行如下命令:
$ source build/envsetup.sh
$ lunch sdk-eng
$ make sdk
2.運行make sdk(或者make -j4 sdk加速編譯)開始編譯,10分鐘過去了,錯誤終于來了,如下
Install: out/host/linux-x86/framework/liblzf.jar
## Running sdk/eclipse/scripts/create_all_symlinks.sh
### Starting tools/base: gradlew publishLocal
sdk/eclipse/scripts/create_all_symlinks.sh: line 285: cd: tools/base: No such file or directory
make: *** [out/host/linux-x86/obj/EXECUTABLES/monitor_intermediates/monitor] Error 1
報錯很明顯,toos/base這個目錄或文件找不到,網(wǎng)上搜了下,答案是這個文件在.repo中,需要去同步下載更新,no no no...按照這個方法,什么時候才能下載下來,接著搜索,終于找到了一個粗暴而簡單的的解決辦法,不知道有沒有后遺癥;辦法是把所有用到tools/base的地方都注釋掉,文件所在路徑如下:
/home/zhangyipeng/Documents/android4.4/sdk/eclipse/scripts/create_all_symlinks.sh
使用sublime text打開,找到所有tools/base的使用地方注釋掉,繼續(xù)make sdk,過了1分鐘又來了一個錯誤,還是這個create_all_symlinks.sh文件中的tools/swt: No such file or directory ,繼續(xù)把tools/swt相關的地方注釋掉,
修改的幾個地方如下圖:
接著make sdk,再繼續(xù)在編譯...
3.等了近20分鐘,又出現(xiàn)了一個類似的錯誤:
Install: out/host/linux-x86/framework/liblzf.jar
## Running sdk/eclipse/scripts/create_all_symlinks.sh
### Starting tools/base: gradlew publishLocal
sdk/build/toos.atree: line 124: cd: tools/base: No such file or directory
文件位置:
/home/zhangyipeng/Documents/android4.4/sdk/build/toos.atree
修改如下圖:
以上問題參考網(wǎng)站:
http://blog.csdn.net/lincyang/article/details/48630185/
http://blog.sina.com.cn/s/blog_4ba5b45e0102ejyg.html
4.最后一次make sdk,大概10分鐘過去了,終于迎來了勝利的曙光_
生成的sdk所在位置:
注:我們自己通過源碼編譯的sdk是最適合這套源碼的sdk,以后編譯其他功能可能會用到。也有可能會因為其他編譯命令而把sdk刪了,最好把編譯好的sdk拷貝一份放置到源碼外。
四.kernel編譯
注意:編譯完源碼和sdk最好把整個源碼備份一下,不然可能會因為一些命令把system.img刪除了。那時就要重新編譯,不過不需要3個小時那么久,只要編譯過一次再次編譯大概需要近半個小時。在編譯kernel時我就遇到了這個問題,編譯完kernel,居然找不到system.img了,到out中去找,果然被刪除了,欲哭無淚>_< , 不過還好我有先見之名,我編譯完sdk直接把真?zhèn)€虛擬機系統(tǒng)都拷貝了一份,整整62.53G。我實在不想重新編譯源碼了,也不想編譯kernel了,就先把整個編譯后的kernel也拷貝了一份到mac本機。然后把當前虛擬機刪了,使用拷貝的虛擬機系統(tǒng)運行,然后把備份的kernel再拷貝到虛擬機中的源碼下,這下可以終于可以使用自己編譯的kernel運行模擬器了。
1.在android4.4源碼目錄下,建一個空的kernel文件夾,把解壓后的goldfish-android-goldfish-3.4文件夾移動到kernel目錄下,如下圖:
2.進入goldfish-android-goldfish-3.4目錄下,配置環(huán)境變量,運行如下命令:
export PATH=$PATH:/home/zhangyipeng/Documents/android4.4/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin
3.修改goldfish-android-goldfish-3.4目錄下的Makefile文件,如下圖:
#ARCH ?= $(SUBARCH)
#CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
#上面注釋掉,加入下面的
ARCH ?= arm
CROSS_COMPILE ?= arm-eabi-
4.在goldfish-android-goldfish-3.4目錄下如下命令
$ make goldfish_armv7_defconfig
5.在goldfish-android-goldfish-3.4目錄執(zhí)行make命令:
$ make
6.等了幾分鐘,編譯完成
在/home/zhangyipeng/Documents/android4.4/kernel/goldfish-android-goldfish-3.4/arch/arm/boot目錄下多了兩個文件,如下圖:
6.使用我們上一步編譯的內(nèi)核,運行模擬器,首先進入源碼目錄下,運行如下命令:
$ source build/envsetup.sh
$ lunch sdk-eng
#指定內(nèi)核文件啟動模擬器
$ emulator -kernel ./kernel/goldfish-android-goldfish-3.4/arch/arm/boot/zImage
7.模擬器運行如下,可以看到預編譯源碼時的模擬器相比,內(nèi)核已經(jīng)變了
模擬器運行的時候也可以使用如下命令查看內(nèi)核:
注:找到我們上一步編譯的SDK,進入到platform-tools目錄下(最好把我們編譯的sdk拷貝一份放到源碼外)
$ ./adb shell
root@generic:/ # cd proc
root@generic:/proc # cat version
Linux version 3.4.67 (zhangyipeng@ubuntu) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 PREEMPT Fri Mar 11 17:39:00 CST 2016
8.對比源碼中默認的內(nèi)核與自己編譯的內(nèi)核的區(qū)別,如下圖:
到此,編譯過程終于結(jié)束了,耶?。。?/p>
注:所有需要的資源都已經(jīng)在文章開頭提供,如果你用我提供的這些資源編譯源碼、sdk及kernel,再按照我上面的過程一步一步的來,成功編譯不在話下。各位簡友可能注意到文件日期了,從截圖就可以看出來,這篇文章是我這兩天(16.3.10~16.3.11號)一邊編譯一邊寫的,絕對可靠。而且步驟也比較詳細、完善(包含了源碼編譯、sdk編譯、內(nèi)核編譯)。
10.如果編譯完成了,想把源碼導入到Android Studio中查看,請接著看下篇文章:
Android Studio導入android源碼技巧(源碼無需編譯即可導入)