Android平台開發 -Android build system-編譯系統分析

來源:互聯網
上載者:User

本文轉自:http://blog.sina.com.cn/s/blog_569a151b0100nmym.html

 

一、預習Makefile
二、Android編譯系統的層次
三、Android編譯系統的常用設定檔
四、 Android編譯系統的流程
五、Android編譯系統的使用

 一、預習Makefile  Makefile的規則:
    target
... : prerequisites ...
      command

           
...
           
...
  target也就是一個目標檔案,可以是Object
File,也可以是執行檔案。還可以是一個標籤(Label)。
  prerequisites就是,要產生那個target所需要的檔案或是目
標。
  command也就是make需要執行的命令。(任意的Shell命令)

  這是一個檔案的依賴關係,也就是說,target這
一個或多個的目標檔案依賴於prerequisites中的檔案,
  其建置規則定義在command中。
說白一點就是說,prerequisites中如果有一個以上的檔案比target文  件要新的話,command所定義的命令就會被執行。這就是
Makefile的規則。也就是Makefile中最核心的 
內容。正如上面作者所述,上面是Makefile中最核心的內容,Android編譯系統符合GNU make的標準,
  當然這 也是Android 編譯系統最核心的內容。
  
二、Android編譯系統的層次  Android編譯系統(build
system)集中於Android源碼下的build/core下,在Android2.2中,共有 
56個*.mk檔案。另外還有一些shell指令碼。Android編譯系統完成的並不僅僅是對目標(主機)系統二進 
制檔案、java應用程式的編譯、連結、打包等,而且還有包括產生各種依賴關係、確保某個模組的修改引起 
相依賴的檔案的重新編譯連結,甚至還包括目標檔案系統的產生,設定檔的產生等,因此Android編譯系 
統具有支援多架構(linux-x86、windows、arm等)、多語言(彙編、C、C++、Java等)、多目標、多  編譯方式。
  
  編譯層次包含了下表描述的抽象層。每一層都與一個或多個層相關聯。例如,一個arch有多個
board,每個 
board有多個device。你可以在一個層中定義一個元素,以達到排除複製,簡化維護的目的。  Layer                 
Example                      Description  Product    myProduct,
myProduct_eu, j2,
sdk  產品層定義完整的移植產品的文法。            
myProduct_eu_fr,                  定義要編譯哪些模組,怎麼配置。基於地區                                               或者基於特性,比如照相機,你可能要提供幾                                               個不同的版本。  Device    myDevice,
myDevice_eu,             裝置層代表裝置的物理層。例如,北美裝置可           
myDevice_eu_lite                   能包含QWERTY鍵盤,而在法國售賣的裝置可能                                              
包含AZERTY鍵盤。外圍裝置一般與裝置層串連                          Board    
sardine, trout,
goldfish           電路板層代表產品的原始圖。可能還有外圍裝置                                              
串連到這一層。  Arch     arm
(arm5te) (arm6), x86,
68k       體系層描述了在電路版上啟動並執行處理器。 三、Android編譯系統的常用設定檔   在Android中,主要的Makefile檔案存在於build/core/目錄下,它的表現形式為多個尾碼為mk的檔案組  成,也稱為build system。Android
build system 主要有兩大部分構成:配置部分,目標構建部分。  Build
system的主流程檔案為build/core/main.mk檔案。
  幾個很重要的*.mk檔案如下:
  
    buildspec.mk:
位於根目錄下,可在此選擇要產生的product 、平台、額外的module/package等。       
build/buildspec.mk.default是樣板。  

    AndroidProducts.mk:
即為Android build system提供給廠商的介面檔案。通過此檔案即可定義所

       
需編譯和安裝的packages(也即應用程式)。預設選項是generic。  

    BoardConfig.mk:
是為product主板做設定,例如driver選擇設定,選擇CPU架構等等。
    Android.mk:是
module 和 package 的設定檔案,每個 module/package 的目錄下都會有一個       
Android.mk。所謂的 module 是指系統的 native code ,相對於用 Java寫成的       
Androidapplication 稱為 package。
    Build/envsetup.mk:編譯環
境初始化,定義一些實用的shell函數,方便編譯使用。
    build/core/Makefile:包含build/core
/main.mk,此檔案主要控制產生         system.img,ramdisk.img,userdata.img,以及recorvery
image,sdk等。
    main.mk:
實際的主控Makefile,例如找到TOP目錄下所有Android.mk檔案。
    config.mk:定義了編譯目標程式所需的工具鏈
及編譯參數。
    base_rules.mk:對一些Makefile的變數規則化

    Binary.mk:控制如何產生目標文

    Clear_vars.mk:清除編譯系統中用到的臨時變數

    definations.mk:定義了很多編譯系統中用到
的宏,相當於函數庫
    Copy_headers.mk:將標頭檔拷貝到指定目錄

    Combo/linux-arm.mk:控
制如何產生linux-arm二進位檔案,包括ARM相關的編譯器,編譯參數等的

        設定

    build/envsetup.sh:提供了幾個有用的命令,執行
. build/envsetup.sh(.後面有空格)。
    

  註:其中對模組編譯有協助的是tapas、m、mm、mmm這幾個命
令。
  
      1、tapas——以互動方式設定build環境變數。

        輸入:tapas

           第
一步,選擇目標裝置:
             例如
我們選擇1
           第二步,選擇代碼格式:

             我
們選擇1
           第三步,選擇產品平台:

             注意:這裡,Google原始碼裡預設是
generic。
             

      2、m、mm、mmm使用獨立模組的make命令

        m
從根目錄開始編譯;
        mm
編譯目前的目錄下的所有模組;
        mmm
編譯指定目錄下的所有模組;
  
四、 Android編譯系統的流程   主要流程都是由 build/core/main.mk
所安排的。
    1、初始化相關變數

    2、檢測編譯環
境和目標環境
    3、決定目標product

    4、讀取
product 的設定
    5、讀取
product 所指定之目標平台架構設定
    6、選擇
toolchain
    7、指定編譯參數
(*-.mk)
    8、
清除輸出目錄
    9、設定/檢查版本編號

    10、讀取所有
BoardConfig.mk 檔案
    11、
讀取所有 module 的設定
    12、根據設定,產生必需的
rule
    13、產生
image
  
  1、 初始化和檢測
  
    由
build/core/config.mk 進行。 build/core/envsetup.mk 檢查 developer
的設定    
(buildspec.mk),並檢查執行環境,以決定輸出目錄和環境。build/core/config.mk 本身還依據   
參數,決定解釋時的相關參數,例如 compiler 的路徑、flags, lex 、yacc 的路徑參數等。關於   
product的相關設定,則是由build/core/product_config.mk 所處理,使用   
build/core/product.mk提供之 macro 載入。根據 AndroidProduct.mk 的內容,   
product_config.mk
決定了:PRODUCT_TAGS,OTA_PUBLIC_KEYS,PRODUCT_POLICY等。
    

  2、Product 設定的讀取

    Android
product 的設定來自於build/target/product/AndroidProduct.mk 和 vendor
子目   
錄下AndroidProduct.mk 。building system透過 find 指令,找出所有可能的   
AndroidProduct.mk。AndroidProduct.mk裡定義PRODUCT_MAKEFILES變數,列舉所有實際定義   
product的 makefile。這些makefile 各自訂獨立的 product。product 相關參數,存成   
PRODUCTS. . 形式的變數。並將makefile 路徑存在 PRODUCTS
變數。因此,透過 PRODUCTS 能取    得所有的
product 路徑/名稱,並透過 PRODUCTS. . 形式的變數取得內容。
  
  3、 Module 設定的讀取    Module
是指 native code 的軟體模組,而 Java application 則被稱為 package。   
build/core/definitions.mk 定義module/package 相關 macro ,讀取、檢查   
module/package 定義檔;分散 source tree 各處的 Android.mk
檔案。 
    build/core/main.mk
使用 find 指令,在這些子目錄下找出所有 Android.mk ,並將路徑存在   
subdir_makefiles 變數裡。最後,include 這些檔案。這些Android.mk 會 include
定義成變數   
BUILD_SHARED_LIBRARY 、BUILD_PACKAGE 等,和其目的相配的 makefile。這些 makefile
會    變
Android.mk 定義之內容,存成 ALL_MODULES. Android.mk>.
的形式。例如,Android.mk 定   
義了LOCAL_MODULE_SUFFIX ,會變存成 ALL_MODULES.   
Android.mk>.LOCAL_MODULE_SUFFIX 。而 Android.mk 路徑,
同樣會存於ALL_MODULES 變數    裡。尋找
Android.mk 的路徑,基本上會是整個 source tree 。但會依特定的 goal , 選擇性只   
找尋特定目錄。例如 SDK 只需特定目錄下的 Android.mk 。   4、Board Level 設定    和目標平台主板相關之設定,例如使用了什麼裝置、driver
等,或是是否需要編譯bootloader 、   
kernel等,都是在 BoardConfig.mk 裡設定。同樣,每張主板可以有不同設定,存在不同目錄下的   
BoardConfig.mk,以 find 尋找如下檔案:
      build/target/board/$(TARGET_DEVICE)/BoardConfig.mk

      device$(TARGET_DEVICE)/BoardConfig.mk

    TARGET_DEVICE
是 product 所定義,因此同一個 BoardConfig.mk 可被多個 product 所使用。
    一個
TARGET_DEVICE ,通常只有一個 BoardConfig.mk 。 BoardConfig.mk 會被直接    include
到 building system 的 name space 裡。 因此,一些 module 的   
enable/disable ,可以在 BoardConfig.mk 以對應不同的主板。   5、Rules    在
module 的定義檔案 Android.mk 裡,可定義 module 的 tag, LOCAL_MODULE_TAGS,
以分    類這些
module。每一個 product 可以指定需要的 tag (PRODUCT_TAGS),使 building
system    只便宜標示這些
tag 的 module。在 build/core/main.mk 裡,所有標示特定 tag 的 module 收    集為
ALL_DEFAULT_INSTALLED_MODULES,並 include build/core/Makefile
處理。
    build/core/Makefile
為這些 module 產生 rule ,並使產生 image 的 goal depend on 這    些 rule
,使這些 module 被編譯。 五、Android編譯系統的使用
  
  下面兩種方法,第一個產生更穩定的結果。   方法一:    建立buildspec.mk的本地版本。最容易的方法是進入你的裝置目錄,    執行下列指令:    cp
buildspec.mk.default buildspec.mk ; chmod u=rw buildspec.mk     預設的buildspec.mk檔案,所有的選項都是被注釋的,為了建立個人化的配置環境,可以編輯   
buildspec.mk.
    一般設定如下選項就可以拉:

      BUILD_ENV_SEQUENCE_NUMBER
:= 9
      TARGET_BOARD_PLATFORM
:= imx53
      TARGET_PRODUCT
:= mine_mx53    一旦建立了設定檔,然後複製到根目錄下,就能夠通過執行make編譯裝置代碼,在第一次執行這個命令   
的時候,會花費很長時間,在雙核機器上,考慮使用’-j2’(甚至’j4’)以加速編譯。    make
-j2   方法二:    做一個通用的版本,

    執行

      source
//device/envsetup.sh, 這個檔案包含了必要的變數和函數定義,下面有描述:

      cd
$TOP
      .envsetup.sh

      partner_setup
generic  //select generic as the
product
      make
-j4 PRODUCT-generic-user
      

      //你也可以用eng替換user,
產生一個調式版。
      make
-j4 PRODUCT-generic-eng

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.