Android编译流程_makefile流程

来源:互联网 发布:gtx970 gpuz数据 编辑:程序博客网 时间:2024/05/17 06:05
 

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

設定檔

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

·         Android.mk

·         AndroidProducts.mk

·         target_<os>-.mk, host_-.mk and -.mk

o        BoardConfig.mk

o        buildspec.mk

Android.mkmodulepackage的設定檔,每個module/package的目錄下都會有一個Android.mk。所謂的module是指系統的native code,相對於用Java寫成的Androidapplication 稱為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時,將該變數指定為moduleAndroid.mk

o        make ONE_SHOT_MAKEFILE=

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

o        make CREATE_MODULE_INFO_FILE=true

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

HOST_BUILD_TYPETARGET_BUILD_TYPE指定building system產生binary的目的為debugrelease。透過設定此二變數,能產生包含debug informationbinry

o        debug

o        release

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

Goals

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

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

Makefile的流程

o        初始化相關變數

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

o        決定目標product

o        讀取product 的設定

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

§         選擇toolchain

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

o        清除輸出目錄

o        設定/檢查版本編號

o        讀取所有BoardConfig.mk檔案

o        讀取所有module的設定

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

o        產生image

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

初始化和偵測

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

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

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

o        PRODUCT_TAGS

o        OTA_PUBLIC_KEYS

o        PRODUCT_POLICY

o        ......

Product設定的讀取

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

Module設定的讀取

Module是指native code的軟體元件,而Java application則被稱為packagebuild/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_LIBRARYBUILD_PACKAGE等,和其目的相配的makefile。這些makefile會變Android.mk 定義之內容,存成ALL_MODULES. .mk>.形式。例如,Android.mk 定義了LOCAL_MODULE_SUFFIX,變會存成ALL_MODULES. .mk>.LOCAL_MODULE_SUFFIX。而Android.mk 路徑,當樣會存於ALL_MODULES變數裡。

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

Board Level設定

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

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

o        vendor/*/$(TARGET_DEVICE)/BoardConfig.mk

TARGET_DEVICEproduct所定義,因此同一個BoardConfig.mk可被多個product所使用。一個TARGET_DEVICE,通常只有一個BoardConfig.mkBoardConfig.mk會被直接includebuilding systemname space裡。因此,一些moduleenable/disable,可以在BoardConfig.mk以對映不同的主板。

Rules

module的定義檔Android.mk 裡,可定義moduletagLOCAL_MODULE_TAGS,以分類這些module。每一個product可以指定需要的tag (PRODUCT_TAGS),使building system只編譯標示這些tagmodule。在build/core/main.mk裡,所有標示特定tagmodule收集為ALL_DEFAULT_INSTALLED_MODULES,並include build/core/Makefile處理。

build/core/Makefile為這些module產生rule,並使產生imagegoal depend on這些rule,使這些module被編譯。

結論

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