在以前的文章中,爲讀者介紹了《Ubuntu Linux下android源碼下載方法》、《Ubuntu11.10下配置android的Eclipse開發環境》以及配置過程當中遇到的一些問題,本文繼續爲你們介紹Ubuntu11.10下android源碼4.0.3的編譯方法。java
一、初始化編譯環境python
軟件需求:
Python2.5-2.7,能夠http://www.python.org/download/下載(Ubuntu11.10自帶)。
JDK6:編譯Gingerbread或更新版本;JDK5:編譯Froyo或更早版本。能夠到http://java.sun.com/javase/downloads/下載,或經過Ubuntu軟件中心下載更方便。
Git1.7或更新版本,能夠到http://git-scm.com/download下載,或直接在終端下sudo apt-get install git下載便可。linux
安裝JDK
在Ubuntu下安裝JDK比較簡單,能夠在軟件中心直接搜索安裝,也能夠按如下方法安裝:
安裝JAVA6:android
$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" $ sudo apt-get update $ sudo apt-get install sun-java6-jdk
安裝JAVA5: git
$ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse" $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse" $ sudo apt-get update $ sudo apt-get install sun-java5-jdk
安裝編譯所需的軟件包: shell
$ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so $ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev libncurses5-dev x11proto-core-dev libx11-dev libreadline6-dev libgl1-mesa-dev tofrodos python-markdown libxml2-utils xsltproc
配置USB訪問權限
在GNU/Linux系統下(特別是Ubuntu系統下),默認配置下普通用戶不能直接訪問USB設備,須要對系統進行一些配置。
以超級用戶建立新配置文件/etc/udev/rules.d/51-android.rules,並將如下內容拷貝到新配置文件中:ubuntu
# adb protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>" # fastboot protocol on passion (Nexus One) SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>" # adb protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>" # fastboot protocol on crespo/crespo4g (Nexus S) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>" # adb protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>" # fastboot protocol on stingray/wingray (Xoom) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>" # adb protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>" # fastboot protocol on maguro/toro (Galaxy Nexus) SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>" # adb protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>" # fastboot protocol on panda (PandaBoard) SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
而且將以上內容中的緩存
「<username>」
修改成用戶名,如修改成」Taskiller」。bash
二、配置ccache
ccache(「compiler cache」的縮寫)是一個編譯器緩存,該工具會高速緩存編譯生成的信息,並在編譯的特定部分使用高速緩存的信息, 好比頭文件,這樣就節省了一般使用cpp解析這些信息所須要的時間。若是您編譯清單2中的文件,假定foobar.h中包含對其餘頭文件的引用,ccache會用那個文件的 cpp-parsed版原本取代include聲明。ccache只是將最終的文本拷貝到文件中,使得它能夠當即被編譯,而不是真正去讀取、理解並解釋其內容。markdown
這一步是可選的。我在編譯的時候沒有配置ccache,最後的編譯時間用了尼瑪至少六個小時以上,雖然目前我尚未嘗試過配置ccache後的編譯速度,這裏仍是建議讀者配置一下,以節省編譯時間,不要像我這麼悲催。配置方法以下:
打開用戶目錄下的.bashrc,將下面語句添加到文件後面並保存退出:
export USE_CCACHE=1
默認狀況下cache(緩存)會保存在~/.ccache目錄下,若是主目錄位於NFS或其餘非本地文件系統上,也要將下面語句添加到.bashrc中,以後保存並退出:
export CCACHE_DIR=<path-to-your-cache-directory>
將
<path-to-your-cache-directory>修改成cache目錄的位置。
推薦的cache目錄大小爲50-100GB,在命令行執行如下命令:
prebuilt/linux-x86/ccache/ccache -M 50G
該設置會保存到CCACHE_DIR中,且該命令是長效的,不會因系統重啓而失效。
三、換用gcc與g++的較低版本
Ubuntu11.10自帶的gcc與g++版本爲4.6,用該版本編譯android時會遇到一些錯誤,如:
host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner) host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp <命令行>:0:0: 錯誤: 「_FORTIFY_SOURCE」重定義 [-Werror] <built-in>:0:0: 附註: 這是先前定義的位置 cc1plus:全部的警告都被看成是錯誤
網上有文章說修改build/core/combo/HOST_linux-x86.mk文件,將
HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改爲
HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0
這種方法雖然能解決該問題,但也會引出新的問題,還要繼續不斷的修改,很麻煩,並且也會破壞android源碼的原生狀態。可是若是使用4.4版本的gcc與g++,則不會出現這些錯誤,方法以下:
經過gcc -v命令能夠發現gcc庫在/usr/lib/gcc/i686-linux-gnu目錄下,該目錄下有當前系統支持的各類版本gcc庫 。在安裝gcc 4.4前該目錄下是沒有4.4目錄的,安裝gcc 4.4後該目錄下就會多出4.4這個目錄,且該4.4目錄下有各類相應庫文件。
ubuntu 32bit系統下安裝gcc 4.4的最好方法是僅用如下兩條命令,不須要其它命令,不然編譯時可能會出錯。
$sudo apt-get install gcc-4.4 $sudo apt-get install g++-4.4
裝完後進入到/usr/bin目錄下
$ls -l gcc*
會顯示如下結果
lrwxrwxrwx 1 root root 7 2011-10-29 09:11 gcc -> gcc-4.6
-rwxr-xr-x 1 root root 224544 2011-10-06 05:47 gcc-4.4
-rwxr-xr-x 1 root root 302104 2011-09-17 05:43 gcc-4.6
發現gcc連接到gcc-4.6, 須要將它改成連接到gcc-4.4,方法以下:
$sudo mv gcc gcc.bak $sudo ln -s gcc-4.4 gcc
同理,對g++也作一樣的修改:
$ls -l g++*
輸出結果以下:
lrwxrwxrwx 1 root root 7 2011-08-14 15:17 g++ -> g++-4.6
-rwxr-xr-x 1 root root 228640 2011-10-06 05:45 g++-4.4
-rwxr-xr-x 1 root root 306200 2011-09-17 05:39 g++-4.6
須要將g++連接改成g++-4.4:
$sudo mv g++ g++.bak $sudo ln -s g++-4.4 g++
再查看gcc和g++版本號:
gcc -v
g++ -v
均顯示gcc version 4.4.6 ,說明gcc 4.4安裝成功。
四、接下來即是對android源碼進行編譯
進入到源碼目錄,本人的目錄爲/home/tasiller/android/source。用envsetup.sh腳本初始化安裝環境。可用如下代碼:
$source build/envsetup.sh
或
$. build/envsetup.sh
注意.後面有一個空格。
以後,選擇要編譯的目標:
$lunch full-eng
以後即是用make命令編譯源碼了:
$make -j4
這裏-j4表示用四個線程編譯,4表示線程數,讀者可根據本身機器的狀況設置(如機器爲單CPU雙核處理器,可設置爲-j2或-j4,即該數爲CPU內核總數或內核總數的2倍。)
以後就是漫長的等待了。。。
編譯完成後,能夠在源碼目錄的out/target/product/generic/目錄下看到編譯好的ramdisk.img、system.img和userdata.img了。
歡迎你們到個人博客 http://taskiller.tk/坐坐