Ubuntu11.10下編譯android源碼4.0.3

在以前的文章中,爲讀者介紹了《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/坐坐
相關文章
相關標籤/搜索