Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> [Android系統的移植與平台開發]准備Android開發環境

[Android系統的移植與平台開發]准備Android開發環境

編輯:Android開發實例

編譯Android源碼

關於android系統的編譯,Android的官方網站上也給出了詳細的說明。

http://source.android.com/source/building.html

 

Ø  初始化編譯環境

切換到Android源碼目錄:

$ cd WORKING_DIRECTORY

執行下面命令,加載編譯過程中用到的命令、環境變量:

$ source build/envsetup.sh

 

Ø  選擇編譯選項

執行下面的命令,從列表中選擇一個編譯項:

$ lunch

You're building on Linux

 

Lunch menu... pick a combo:

     1. full-eng

     2.full_x86-eng

     3.vbox_x86-eng

     4.full_maguro-userdebug

     5.full_tuna-userdebug

     6.full_panda-eng

我們選擇:1,也就是說,編譯full-eng的目標,當然我們也可以直接指定編譯項,如下:

$ lunch full-eng

其中,lunch命令是指打印或設置出當前系統中設置的編譯項,full-eng這個編譯項由兩部分組成,其中前半部分full表示目標設備為Android的模擬器,官方解釋為:fully configured with all languages,apps, input methods,全部的應用程序及語言,輸入法等。後半部分eng表示帶有調試功能的工程機。

lunch命令打印全部的信息,如下表所示:

Build name

Device

Notes

full

emulator

fully configured with all languages, apps, input methods

full_maguro

maguro

full build running on Galaxy Nexus GSM/HSPA+ ("maguro")

full_panda

panda

full build running on PandaBoard ("panda")

Buildtype

Use

user

limited access; suited for production

userdebug

like "user" but with root access and debuggability; preferred for debugging

eng

development configuration with additional debugging tools

 

Ø  編譯前的准備

由於我們使用ubuntu12.04對Android進行編譯,Android對Ubuntu12.04的編譯平台的支持不是很推薦,有些庫的兼容方面會有一些問題,在編譯過程中會產生一些錯誤,我們要進行一些修正。

錯誤信息:

g++ selected multilib '32' not installed

<command-line>:0:0: error:"_FORTIFY_SOURCE" redefined [-Werror]
 <built-in>:0:0: note: this is thelocation of the previous definition
 cc1plus: all warnings being treated aserrors
make: ***[out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

原因:

在Android系統過程中,要使用gcc-4.4/g++-4.4的編譯器,而Ubuntu12.04的gcc版本為4.6.3

解決方法:

安裝gcc-4.4

$sudo apt-get install gcc-4.4

$sudo apt-get install g++-4.4

進入到/usr/bin目錄下,刪除gcc對gcc-4.6的鏈接,創建到新安裝的gcc-4.4的鏈接:

$cd /usr/bin

$sudo rm -r gcc

$sudo ln -s gcc-4.4 gcc

驗證結果:

$gcc -v

$g++ -v

打印其版本為gcc-4.4x、g++-4.4x即可。

 

Ø  編譯源碼

輸入下面命令開始編譯:

$ make -jn

其中,-jn表示,n個線程同時編譯,一般n的值為CPU核的2倍,但是,也要和你的Ubuntu的內存有關系,每個線程在編譯時最少需要1G內存,如果你沒有很多內存,還是直接使用make命令吧,否則,編譯到後面會出錯。

這個過程,如果是虛擬機的話,至少要4個多小時,如果是實體機的話,要看配置,一般在1個小時以上。

編譯成功結果如下圖所示:


 

 

編譯goldfish內核源碼

 

編譯Linux源碼必然要先指定gcc交叉編譯器,我們直接使用Android自帶的arm-eabi-4.4.3編譯器,它在WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin路徑下。

$ ls WORKING_DIRECTORY/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin

 


 

我們編譯下面一個編譯腳本make_zImage.sh,讓這個腳本去編譯goldfish的內核:

#!/bin/bash

export PATH=/home/farsight/andorid/android4.0/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin:$PATH

export ARCH=arm

export SUBARCH=arm 

export CROSS_COMPILE=arm-eabi- 

make goldfish_armv7_defconfig 

make

給make_zImage.sh添加可執行權限,然後執行該編譯腳本:

$ chmod a+x make_zImage.sh

$ ./make_zImage.sh

當我們看到下面的結果時,表示goldfish的內核編譯出來了:


 

 

4.    Android編譯過程分析

 

如果想要了解,Android的編譯過程,可以參照下面三篇博文:

Android編譯系統詳解(一)

Android編譯系統詳解(二)

Android編譯系統詳解(三)

按照google給出的編譯步驟如下:

  1> source build/envsetup.sh:加載命令

  2> lunch:選擇目標平台編譯選項

  3> make:執行編譯

我們按照編譯步驟來分析編譯過程的細節,最終添加自己的平台產品的編譯選項。

 

4.1 source build/envsetup.sh

該命令是用來將envsetup.sh裡的所有用到的命令加載到環境變量裡去。主要幾個命令如下:

function help()                                                                                #顯示幫助信息

function check_product()                                           # 檢查product

function check_variant()                                             # 檢查變量

function printconfig()                                                                    #打印配置

function add_lunch_combo()                                    # 添加lunch項目

function print_lunch_menu()                                    # 打印lunch列表

function lunch()                                                                              #配置lunch

function m()                                                                                     #make from top

function mm()                                                                                 #make from current directory

function mmm()                                                                              #make the supplied directories

 

build/envsetup.sh其主要作用如下:

ü  加載了編譯時使用到的函數命令,如:help,lunch,m,mm,mmm等

ü  添加了兩個編譯選項:generic-eng和simulator,這兩個選項是系統默認選項

ü  查找vendor/*/*/vendorsetup.sh和device/*/*/vendorsetup.sh,也就是說從vendor/<廠商目錄>/<平台設備目錄>/目錄和device/<廠商目錄>/<平台設備目錄>/目錄下,查找vendorsetup.sh,如果找到的話,加載執行它,添加廠商自定義產品的編譯選項。

如果想要添加自己的目標設備編譯選項,我們就要在device或vendor目錄下創建設備廠商,然後在設備廠商目錄下,創建一個vendorsetup.sh文件,在裡面添加上自己的編譯項。

$mkdir -p device/farsight/fsdevice

$touch device/farsight/fsdevice/vendorsetup.sh 

$echo "add_lunch_combo fs100-eng" > device/farsight/fsdevice/vendorsetup.sh

注:

                  farsight:廠商名

                  fsdevice:平台設備名

                  fs100-eng:自定義的目標產品名為fs100,eng為編譯目標類型

所有的編譯項的格式都是:設備名-編譯目標類型,編譯目標類型為:eng,user,userdebug,三種類型之一(詳細見3.1節)。

 

下面驗證一下我們的結果,當在Android目錄下,再次執行source build/envsetup.sh時,我們可以看到我們新添加的編譯項:

 

4.2執行lunch full-eng

我們當然也可以直接執行lunch命令,然後在彈出菜單裡面來選擇我們的編譯項,如下圖所示:

 


 

注:我們添加的編譯項這時已經存在了,但是如果你選擇了它,在編譯時會出錯,因為我們還沒有對應編譯項的配置文件。

lunch命令可以帶參數和不帶參數,最終導出一些重要的環境變量,從而影響編譯系統的編譯結果。導出的變量如下(以lunch full-eng為例):

TARGET_PRODUCT=full

TARGET_BUILD_VARIANT=eng

TARGET_BUILD_TYPE=release 

 

 

4.3執行make命令

當我們輸入make命令後,就開始android系統的編譯了,所有的Makefile都通過build/core/main.mk這個文件組織在一起,它定義了一個默認goals:droid,當我們在TOP目錄下,敲make實際上就等同於我們執行make droid。

當make include所有的文件,完成對所有make文件的解析以後就會尋找生成droid的規則,依次生成它的依賴,直到所有滿足的模塊被編譯好,然後使用相應的工具打包成相應的img。其中,config.mk,envsetup.mk,product_config.mk文件是編譯用戶指定平台系統的關鍵文件。Android的編譯系統比較復雜,詳細的說明請參照前面給出博文內容。

下面列出在編譯過程中經常使用的一些命令:

source build/envsetup.sh:加載編譯命令,產生編譯選項

lunch或lunch xxx-yyy:打印編譯選項菜單或指定編譯選項,xxx表示產品,yyy表示編譯類型

make:根據lunch選項,編譯Android系統,最後產出為:system.img,ramdisk.img,userdate.img

m:和make命令一樣

mm:從當前目錄下開始向下編譯目標

mmm:指定一個目錄,僅編譯指定目錄下的目標

make snod:只將out/target/product/XXX/system/目錄下的內容打包生成system.img,不會檢查依賴關系

make bootimage:只將out/target/product/XXX/root/目錄下的內容打包生成ramdisk.img

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved