歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> Ubuntu11.10下編譯android源碼4.0.3

Ubuntu11.10下編譯android源碼4.0.3

日期:2017/3/1 17:22:09   编辑:關於Linux
在之前的文章中,為讀者介紹了《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