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.mk是module和package的設定檔,每個module/package的目錄下都會有一個Android.mk。所謂的module是指系統的native code,相對於用Java寫成的Androidapplication 稱為package。
AndroidProducts.mk則設定product配置。product即特定系統版本,透過編譯不同product,產生不同軟體配置內容,安裝不同的application。Product可視為特定專案,產生特定規格系統。
BoardConfig.mk是為product主板做設定,像是driver選擇、設定。*-.mk則是針對選擇的作業系統和CPU架構,進行相關設定。
buildspec.mk是位於source根目錄下,為進行編譯者所做之額外設定。例如,可在此選擇要產生的product、平台、額外的module/package等。
參數
build/envsetup.sh實作一個mm指令,以編譯單一module,不需編譯整個source tree。ONE_SHOT_MAKEFILE這個makefile變數/參數就是用以實作這個功能。使用方法是在執行make時,將該變數指定為module的Android.mk。
o make ONE_SHOT_MAKEFILE=
透過定義CREATE_MODULE_INFO_FILE,building system會將所有module資訊列在$(PRODUCT_OUT)/module-info.txt檔案裡。
o 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。
o debug
o release
這些參數,也可設於buildspec.mk裡,以避免開發過程不斷的重新指定。
Goals
一般編輯整個Android 系統,就是使用droid這個goal。droid會產生一個完整的系統,包括bootloader、kernel、系統程式、模組和應用程式。
showcommands和droid功能相同,但droid在編譯過程不顯示所使用的指令。透過showcommands這個goal,building 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的路徑、flags,lex、yacc的路徑參數等。
關於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.mk和vendor子目錄下的AndroidProduct.mk。building system透過find指令,找出所有可能的AndroidProduct.mk。AndroidProduct.mk裡定義PRODUCT_MAKEFILES變數,列舉所有實際定義product的makefile。這些makefile各自定義獨立的product。product相關參數,存成PRODUCTS. .形式的變數。並將makefile路徑存在PRODUCTS變數。因此,透過PRODUCTS能取得所有的product路徑/名稱,並透過PRODUCTS. .形式的變數取得內容。
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. .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等,或是是否需要編譯bootloader、kernel等,都是在BoardConfig.mk裡設定。同樣,每張主板可以有不同設定,存在不同目錄下的BoardConfig.mk,以find尋找如下檔案:
o build/target/board/$(TARGET_DEVICE)/BoardConfig.mk
o 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的定義檔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的building system其實不是那麼複雜。在了解之後,也不是那麼難修改。但,GNU make的一些語法,所building system使用一些不是那麼直覺的用法,使的building system較難了解。但,花點心思就能克服
- Android编译流程_makefile流程
- vlc-android编译流程
- vlc-android编译流程
- android 编译流程
- android framework编译流程
- vlc-android编译流程
- android系统编译流程
- android vlc 编译流程
- Android 源码编译流程
- vlc-android编译流程
- Android编译流程笔记
- vlc-android编译流程
- Android编译系统流程
- Android 编译流程
- android 源码编译流程
- Android Framework 编译流程
- Android 系统编译流程
- Android编译系统的流程
- sqlserver 数据库查询技巧
- 我的程序生涯【转载】
- Android Service 之Bound Service
- ENC 03测试程序
- 管理12字诀
- Android编译流程_makefile流程
- linux中断导读之--处理流程
- 2012 学习计划
- arm存储模块
- 苹果收购好莱坞公司并非明智之举
- hello, c/c++
- 深入浅出URL编码 .
- Ubuntu下SVN+Apache版本管理服务器配置
- shell脚本文件操作