Android Makefile 種類
Android以模組的形式來組織各個系統中的部件,專業點的詞彙就是Module,就是各位在幾乎每個目錄下都能看到的Android. mk。可以簡單地把Android所有的Make檔案分為4種:
For config ,Module Compile ,Local Module ,Package
2.1、For config
這類檔案主要來配置product,board,以及根據你的Host和Target選擇相應的工具以及設定相應的通用編譯選項:
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
裡面主要定義了各種Host和Target結合的編譯器和編譯選項。
2.2、 Module Compile
這類檔案主要定義如何來處理Module的Android.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.3、Local Module
區域模組的Makefile檔案就是我們在Android裡面幾乎上隨處可見的Android.mk。 Android進行編譯的時候會通過下面的函數來搜尋所有子目錄中的Android.mk,一旦找到就不會再往子目錄繼續尋找(所有你的模組定義的頂層Android.mk必須包含自己定義的子目錄中的Android.mk)。
subdir_makefiles += \
$(shell build/tools/findleaves.sh --prune="./out" $(subdirs) Android.mk)
不同類型的區域模組具有不同的語法,但基本上是相通的,只有個別變數的不同。
Android通過LOCAL_MODULE_TAGS來決定哪些區域模組會不會編譯進系統,通過PRODUCT和LOCAL_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/ordevelopment
.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.4、Package
這主要指的是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這個檔案組織在一起,它定義了一個默認goals:droid,當我們在TOP目錄下敲Make實際上就等同於我們執行make droid。當Make include所有的檔案,完成對所有make我檔案的解析以後就會尋找生成droid的規則,依次生成它的依賴,直到所有滿足的模組被編譯好,然後使用相應的工具打包成相應的img。
基本上Android building system就是以這樣一種方式組織在一起的了。
留言列表