歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Ubuntu11.10下編譯android源碼4.0.3

在之前的文章中,為讀者介紹了《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雲宵閣 原創
 
Copyright © Linux教程網 All Rights Reserved