Chinaunix首页 | 论坛 | 博客
  • 博客访问: 431529
  • 博文数量: 125
  • 博客积分: 2066
  • 博客等级: 大尉
  • 技术积分: 1032
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-16 14:06
文章分类

全部博文(125)

文章存档

2011年(125)

分类: LINUX

2011-05-13 17:49:39


                  Android编译流程_makefile流程.doc             

想要了解一個系統,我常會從 makefile 或是 building system 下手,以了解系統組成元素為何? 目錄結構為何? 對於 § ,我也不例外。透過了解 building system ,我們能知道如何新增、修改、刪除程式,並保有完整性,順利編譯出結果。

設定檔

  § building system 包括幾種重要的設定檔,

  • §.mk

  • AndroidProducts.mk

  • target_-.mk, host_-.mk and -.mk

    • BoardConfig.mk

    • buildspec.mk

§.mk module package 的設定檔,每個 module/package 的目錄下都會有一個 §.mk。所謂的 module 是指系統的 native code ,相對於用 Java 寫成的 § application 稱為 package

AndroidProducts.mk 則設定 product 配置。 product 即特定系統版本,透過編譯不同 product ,產生不同軟體配置內容,安裝不同的 applicationProduct 可視為特定專案,產生特定規格系統。

BoardConfig.mk 是為 product 主板做設定,像是 driver 選擇、設定。*-.mk 則是針對選擇的作業系統和 CPU 架構,進行相關設定。

buildspec.mk 是位於 source 根目錄下,為進行編譯者所做之額外設定。例如,可在此選擇要產生的 product 、平台、額外的 module/package 等。

參數

build/envsetup.sh 實作一個 mm 指令,以編譯單一 module,不需編譯整個 source treeONE_SHOT_MAKEFILE 這個 makefile 變數/參數就是用以實作這個功能。使用方法是在執行 make 時,將該變數指定為 module §.mk

    • make ONE_SHOT_MAKEFILE=

透過定義 CREATE_MODULE_INFO_FILE building system 會將所有 module 資訊列在 $(PRODUCT_OUT)/module-info.txt 檔案裡。

    • make CREATE_MODULE_INFO_FILE=true

設定 BUILD_TINY_ANDROID=true building system 產生一個簡單的 image ,以測試硬體的可用度。此功能用於移植的早期階段,以快速 bring up

HOST_BUILD_TYPE TARGET_BUILD_TYPE 指定 building system 產生 binary 的目的為 debug release 。透過設定此二變數,能產生包含 debug information binry

    • debug

    • release

這些參數,也可設於 buildspec.mk 裡,以避免開發過程不斷的重新指定。

Goals

一般編輯整個 § 系統,就是使用 droid 這個 goaldroid 會產生一個完整的系統,包括 bootloaderkernel、系統程式、模組和§程式。

showcommands droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。透過 showcommands 這個 goalbuilding system 顯示過程中每一個步驟的詳細指令。

Makefile 的流程

    • 初始化相關變數

    • 偵測編譯環境和目標環境

    • 決定目標 product

    • 讀取 product 的設定

    • 讀取 product 所指定之目標平台架構設定

      • 選擇 toolchain

      • 指定編譯參數 (*-.mk)

    • 清除輸出目錄

    • 設定/檢查版本編號

    • 讀取所有 BoardConfig.mk 檔案

    • 讀取所有 module 的設定

    • 根據設定,產生必需的 rule

    • 產生 image

以上的主要流程都是由 build/core/main.mk 所安排。

初始化和偵測

build/core/config.mk 所進行。 build/core/envsetup.mk 檢查 developer 的設定 (buildspec.mk) ,並檢查執行環境,以決定輸出目錄、項目。

build/core/config.mk 本身還依據參數,決定解譯時的相關參數。像是 compiler 的路徑、flagslex yacc 的路徑參數等。

關於 product 的相關設定,則是由 build/core/product_config.mk 所處理,使用 build/core/product.mk 提供之 macro 載入。根據 AndroidProduct.mk 的內容, product_config.mk 決定了

    • PRODUCT_TAGS

    • OTA_PUBLIC_KEYS

    • PRODUCT_POLICY

    • ......

Product 設定的讀取

§ product 的設定來自於 build/target/product/AndroidProduct.mk vendor 子目錄下的 AndroidProduct.mk building system 透過 find 指令,找出所有可能的 AndroidProduct.mkAndroidProduct.mk 裡定義 PRODUCT_MAKEFILES 變數,列舉所有實際定義 product makefile。這些 makefile 各自定義獨立的 product product 相關參數,存成 PRODUCTS. .形式的變數。並將 makefile 路徑存在 PRODUCTS 變數。因此,透過 PRODUCTS 能取得所有的 product 路徑/名稱,並透過 PRODUCTS. .形式的變數取得內容。

Module 設定的讀取

Module 是指 native code 的軟體元件,而 Java application 則被稱為 packagebuild/core/definitions.mk 定義 module/package 相關 macro ,讀取、檢查 module/package 定義檔;分散 source tree 各處的 §.mk 檔案。 build/core/main.mk 使用 find 指令,在這些子目錄下找出所有 §.mk ,並將路徑存在 subdir_makefiles 變數裡。最後,include 這些檔案。

這些 §.mk include 定義成變數 BUILD_SHARED_LIBRARY BUILD_PACKAGE 等,和其目的相配的 makefile。這些 makefile 會變 §.mk 定義之內容,存成 ALL_MODULES. .mk>.形式。例如, §.mk 定義了 LOCAL_MODULE_SUFFIX ,變會存成 ALL_MODULES. .mk>.LOCAL_MODULE_SUFFIX 。而 §.mk 路徑,當樣會存於 ALL_MODULES 變數裡。

Search §.mk 的路徑,基本上會是整個 source tree 。但會依特定的 goal ,選擇性只找尋特定目錄。例如 SDK 只需特定目錄下的 §.mk

Board Level 設定

和目標平台主板相關之設定,例如使用了什麼裝置、driver 等,或是是否需要編譯 bootloader kernel 等,都是在 BoardConfig.mk 裡設定。同樣,每張主板可以有不同設定,存在不同目錄下的 BoardConfig.mk ,以 find 尋找如下檔案:

    • build/target/board/$(TARGET_DEVICE)/BoardConfig.mk

    • vendor/*/$(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 以對映不同的主板。

Rules

module 的定義檔 §.mk 裡,可定義 module tagLOCAL_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 被編譯。

結論

§ building system 其實不是那麼複雜。在了解之後,也不是那麼難修改。但, GNU make 的一些語法,所 building system 使用一些不是那麼直覺的用法,使的 building system 較難了解。但,花點心思就能克服




阅读(1738) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~