在之前的文章中,為讀者介紹了《Ubuntu Linux下android源碼下載方法》、《Ubuntu11.10下配置android的Eclipse開發環境》、配置過程中遇到的一些問題,本文繼續為大家介紹Ubuntu11.10下android源碼4.0.3的編譯方法。
1、初始化編譯環境
軟件需求:
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下載即可。
安裝JDK
在Ubuntu下安裝JDK比較簡單,可以在軟件中心直接搜索安裝,也可以按以下方法安裝:
安裝JAVA6:
1 $ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
2 $ sudo apt-get update
3 $ sudo apt-get install sun-java6-jdk
安裝JAVA5:
1 $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"
2 $ sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
3 $ sudo apt-get update
4 $ sudo apt-get install sun-java5-jdk
安裝編譯所需的軟件包:
1 $ sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
2
3 $ 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,並將以下內容拷貝到新配置文件中:
01 # adb protocol on passion (Nexus One)
02 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
03 # fastboot protocol on passion (Nexus One)
04 SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
05 # adb protocol on crespo/crespo4g (Nexus S)
06 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
07 # fastboot protocol on crespo/crespo4g (Nexus S)
08 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
09 # adb protocol on stingray/wingray (Xoom)
10 SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
11 # fastboot protocol on stingray/wingray (Xoom)
12 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
13 # adb protocol on maguro/toro (Galaxy Nexus)
14 SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
15 # fastboot protocol on maguro/toro (Galaxy Nexus)
16 SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
17 # adb protocol on panda (PandaBoard)
18 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
19 # fastboot protocol on panda (PandaBoard)
20 SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
並且將以上內容中的
1 “<username>”
修改為用戶名,如修改為”Taskiller”。
2、配置ccache
ccache(“compiler cache”的縮寫)是一個編譯器緩存,該工具會高速緩存編譯生成的信息,並在編譯的特定部分使用高速緩存的信息, 比如頭文件,這樣就節省了通常使用cpp解析這些信息所需要的時間。如果您編譯清單2中的文件,假定foobar.h中包含對其他頭文件的引用,ccache會用那個文件的cpp-parsed版本來取代include聲明。ccache只是將最終的文本拷貝到文件中,使得它可以立即被編譯,而不是真正去讀取、理解並解釋其內容。
這一步是可選的。我在編譯的時候沒有配置ccache,最後的編譯時間用了尼瑪至少六個小時以上,雖然目前我還沒有嘗試過配置ccache後的編譯速度,這裡還是建議讀者配置一下,以節省編譯時間,不要像我這麼悲催。配置方法如下:
打開用戶目錄下的.bashrc,將下面語句添加到文件後面並保存退出:
1 export USE_CCACHE=1
默認情況下cache(緩存)會保存在~/.ccache目錄下,如果主目錄位於NFS或其他非本地文件系統上,也要將下面語句添加到.bashrc中,之後保存並退出:
1 export CCACHE_DIR=<path-to-your-cache-directory>
將
1 <path-to-your-cache-directory>修改為cache目錄的位置。
推薦的cache目錄大小為50-100GB,在命令行執行以下命令:
1 prebuilt/linux-x86/ccache/ccache -M 50G
該設置會保存到CCACHE_DIR中,且該命令是長效的,不會因系統重啟而失效。
3、換用gcc與g++的較低版本
Ubuntu11.10自帶的gcc與g++版本為4.6,用該版本編譯android時會遇到一些錯誤,如:
1 host Prebuilt: monkeyrunner (out/host/linux-x86/obj/EXECUTABLES/monkeyrunner_intermediates/monkeyrunner)
2 host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp
3 <命令行>:0:0: 錯誤: “_FORTIFY_SOURCE”重定義[-Werror]
4 <built-in>:0:0: 附注: 這是先前定義的位置
5 cc1plus:所有的警告都被當作是錯誤
網上有文章說修改build/core/combo/HOST_linux-x86.mk文件,將
1 HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0
修改成
1 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的最好方法是僅用以下兩條命令,不需要其它命令,否則編譯時可能會出錯。
1 $sudo apt-get install gcc-4.4
2 $sudo apt-get install g++-4.4
裝完後進入到/usr/bin目錄下
1 $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,方法如下:
1 $sudo mv gcc gcc.bak
2 $sudo ln -s gcc-4.4 gcc
同理,對g++也做同樣的修改:
1 $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:
1 $sudo mv g++ g++.bak
2 $sudo ln -s g++-4.4 g++
再查看gcc和g++版本號:
gcc -v
g++ -v
均顯示gcc version 4.4.6 ,說明gcc 4.4安裝成功。
4、接下來便是對android源碼進行編譯
進入到源碼目錄,本人的目錄為/home/tasiller/android/source。用envsetup.sh腳本初始化安裝環境。可用以下代碼:
1 $source build/envsetup.sh
或
1 $. build/envsetup.sh
注意.後面有一個空格。
之後,選擇要編譯的目標:
1 $lunch full-eng
之後便是用make命令編譯源碼了:
1 $make -j4
這裡-j4表示用四個線程編譯,4表示線程數,讀者可根據自己機器的情況設置(如機器為單CPU雙核處理器,可設置為-j2或-j4,即該數為CPU內核總數或內核總數的2倍。)
之後就是漫長的等待了。。。
編譯完成後,可以在源碼目錄的out/target/product/generic/目錄下看到編譯好的ramdisk.img、system.img和userdata.img了。
如非聲明,本站文章均為Taskiller雲宵閣 原創