close

 

Android Makefile 種類






Android以模組的形式來組織各個系統中的部件,專業點的詞彙就是Module,就是各位在幾乎每個目錄下都能看到的Android. mk。可以簡單地把Android所有的Make檔案分為4種:
For config ,Module Compile ,Local Module ,Package


2.1For config


這類檔案主要來配置productboard,以及根據你的HostTarget選擇相應的工具以及設定相應的通用編譯選項:




build/core/config.mk summary of config
是一個總括性的東西,它裡面定義了各種module編譯所需要使用的HOST工具以及如何來編譯各種模組,比如說BUILT_PREBUILT就定義瞭如何來編譯預編譯模組。


build/core/envsetup.mk generate dir config and so on
主要會讀取由envsetup.sh寫入環境變數中的一些變數來配置編譯過程中的輸出目錄,


build/target/product product config
針對當前的晶片配置定義你將要生產產品的個性配置,主要是指APK方面的配置,哪些APK(Android Package)會包含在哪個product中,哪些APK在當前product中是不提供的。


build/target/board board config
主要是設計到硬體晶片的配置,比如是否提供硬體的某些功能,比如說GPU等等,或者晶片支浮點運算等等。


build/core/combo build flags config
裡面主要定義了各種HostTarget結合的編譯器和編譯選項。
















2.2Module Compile


這類檔案主要定義如何來處理ModuleAndroid.mk,以及採用何種方式來生成目標模組,這些模組生成規則都定義在build/core/config.mk裡面,我們可以看看:


CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk


BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk


BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk


BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk


BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk


BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk


BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk


BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk


BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk


BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk


BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk


BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk


BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk


BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk


BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk


BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk


BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk


BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk


BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk


除了CLEAR_VARS是清楚區域變數之外,其他所有的都對應了一種模組的生成規則,每一個區域模組最後都會include其中的一種來生成目標模組。大部分上面的.mk都會包含base_rules.mk,這是對模組進行處理的基礎檔案,建議要寫區域模組的都去看看,看明白了為什麼Android.mk要這麼寫就會大致明白了。


Ex; host_static_library.mk


LOCAL_IS_HOST_MODULE := true




ifeq ($(strip $(LOCAL_MODULE_CLASS)),)


LOCAL_MODULE_CLASS := STATIC_LIBRARIES


endif


ifeq ($(strip $(LOCAL_MODULE_SUFFIX)),)


LOCAL_MODULE_SUFFIX := .a


endif


LOCAL_UNINSTALLABLE_MODULE := true




include $(BUILD_SYSTEM)/binary.mk




$(LOCAL_BUILT_MODULE): $(all_objects)


$(transform-host-o-to-static-lib)














2.3Local Module


區域模組的Makefile檔案就是我們在Android裡面幾乎上隨處可見的Android.mkAndroid進行編譯的時候會通過下面的函數來搜尋所有子目錄中的Android.mk,一旦找到就不會再往子目錄繼續尋找(所有你的模組定義的頂層Android.mk必須包含自己定義的子目錄中的Android.mk)


subdir_makefiles += \


$(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)




不同類型的區域模組具有不同的語法,但基本上是相通的,只有個別變數的不同。


Android通過LOCAL_MODULE_TAGS來決定哪些區域模組會不會編譯進系統,通過PRODUCTLOCAL_MODULE_TAGS來決定哪些應用包會編譯進系統。此外用戶可以通過buildspec.mk來指定你需要編譯進系統的模組。


LOCAL_MODULE_TAGS 種類


eng


This is the default flavor. A plain "make" is the same as "make eng". droid is an alias for eng.




  • Installs modules tagged with: eng, debug, user, and/or development.



  • Installs non-APK modules that have no tags specified.



  • Installs APKs according to the product definition files, in addition to tagged APKs.



  • ro.secure=0



  • ro.debuggable=1



  • ro.kernel.android.checkjni=1



  • adb is enabled by default.






user


"make user"


This is the flavor intended to be the final release bits.




  • Installs modules tagged with user.



  • Installs non-APK modules that have no tags specified.



  • Installs APKs according to the product definition files; tags are ignored for APK modules.



  • ro.secure=1



  • ro.debuggable=0



  • adb is disabled by default.




userdebug


"make userdebug"


The same as user, except:




  • Also installs modules tagged with debug.



  • ro.debuggable=1



  • adb is enabled by default.





用戶也可以通過mm來編譯指定模組,或者通過make clean-module_name來刪除指定模組。




2.4Package


這主要指的是build/core/Makefile這個檔案,它定義了生成各種img的方式,包括ramdisk.img userdata.img system.img update.zip recover.img等。我們可以看看這些img都是如何生成的,對應著我們常用的幾個make goals






在實際的過程中,我們也可以自己編輯out目錄下的生成檔案,然後手工打包相應生成相應的img,最常用的是加入一些需要集成進的prebuilt file



所有的Makefile都通過build/core/main.mk這個檔案組織在一起,它定義了一個默認goalsdroid,當我們在TOP目錄下敲Make實際上就等同於我們執行make droid。當Make include所有的檔案,完成對所有make檔案的解析以後就會尋找生成droid的規則,依次生成它的依賴,直到所有滿足的模組被編譯好,然後使用相應的工具打包成相應的img




基本上Android building system就是以這樣一種方式組織在一起的了。


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 立你斯 的頭像
    立你斯

    立你斯學習記錄

    立你斯 發表在 痞客邦 留言(0) 人氣()