Android Building System 分析
来源:互联网 发布:aicare袜子怎么样知乎 编辑:程序博客网 时间:2024/05/29 10:08
原文地址:http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/393
想要了解一個系統,我常會從 makefile 或是 building system 下手, 以了解系統組成元素為何? 目錄結構為何? 對於 Android ,我也不例外。 透過了解 building system ,我們能知道如何新增、修改、刪除程式, 並保有完整性,順利編譯出結果。
設定檔
Android building system 包括幾種重要的設定檔,
- Android.mk
- AndroidProducts.mk
- target_<os>-.mk, host_-.mk and -.mk
- BoardConfig.mk
- 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。
- 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
一般編輯整個 Android 系統,就是使用 droid 這個 goal。 droid 會產生一個 完整的系統,包括 bootloader、kernel、系統程式、模組和應用程式。
showcommands 和 droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。 透過 showcommands 這個 goal, building 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的路徑、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
- ......
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.. 形式的變數取得內容。
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.<path of=""Android.mk>. 形式。例如,Android.mk 定義了 LOCAL_MODULE_SUFFIX ,變會存成ALL_MODULES.<path of=""Android.mk>.LOCAL_MODULE_SUFFIX 。而Android.mk 路徑, 當樣會存於 ALL_MODULES 變數裡。
Search Android.mk 的路徑,基本上會是整個 source tree 。但會依特定的 goal , 選擇性只找尋特定目錄。例如 SDK 只需特定目錄下的 Android.mk 。
Board Level 設定
和目標平台主板相關之設定,例如使用了什麼裝置、driver 等,或是是否需要編譯bootloader 、 kernel 等,都是在 BoardConfig.mk 裡設定。同樣,每張主板 可以有不同設定,存在不同目錄下的 BoardConfig.mk ,以 find 尋找如下檔案:
- build/target/board/$(TARGET_DEVICE)/BoardConfig.mk
- vendor/*/$(TARGET_DEVICE)/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 Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- Android Building System 分析
- 重装系统后ORACLE数据库恢复的方法
- 彻底解决IE9 文本框无法输入文字,IE窗口闪烁问题(亲测)
- cocos2d显示对象的继承图
- common-httpclient上传文件
- 【ACE】ACE程序运行时,出现错误 ACE WSA Startup not initialized 的解决
- Android Building System 分析
- VLC 源代码结构
- SYS_GUID()与sequence的比较
- HDU2149 Public Sale 博弈
- the command-line window of vim
- java设计模式--工厂方法设计模式
- 基于Web在线聊天系统初步构想。
- Pareto原理在代码优化中的应用
- Android有效解决加载大图片时内存溢出的问题