LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_PACKAGE_NAME := Settings LOCAL_CERTIFICATE := platform include $(BUILD_PACKAGE) # Use the folloing include to make our test apk. include $(call all-makefiles-under,$(LOCAL_PATH))
該Android.mk文件路徑是package/app/Settings/Android.mk,來分析該文件
GNU Make‘功能’宏,必須通過使用'$(call )'來調用,調用他們將返回文本化的信息。
------------------------------------------------------------------------------------------------------------------------------
(1) LOCAL_PATH:= $(call my-dir)
一個Android.mk file首先必須定義好LOCAL_PATH變量。它用於在開發樹中查找源文件。
宏函數’my-dir’,由編譯系統提供,用於返回當前路徑(即包含Android.mk file文件的目錄)。
------------------------------------------------------------------------------------------------------------------------------
(2) Android.mk中可以定義多個編譯模塊,每個編譯模塊都是以include $(CLEAR_VARS)開始,以include $(BUILD_XXX)結束。
(2.1) include $(CLEAR_VARS)
CLEAR_VARS指的是clear_vars.mk,由編譯系統提供,它會讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
這是必要的,因為所有的編譯控制文件都在同一個GNU MAKE執行環境中,所有的變量都是全局的。
(2.2) include $(BUILD_PACKAGE) # Tell it to build an APK
$(BUILD_PACKAGE)是用來編譯生成package/app/下的apk。
還有其他幾種編譯情況:
include $(BUILD_STATIC_LIBRARY) 表示編譯成靜態庫
include $(BUILD_SHARED_LIBRARY) 表示編譯成動態庫
include $(BUILD_EXECUTABLE) 表示編譯成可執行程序
至於例子的話,跳轉到下面的"擴展"
------------------------------------------------------------------------------------------------------------------------------
(3) LOCAL_MODULE_TAGS := optional
解析:
LOCAL_MODULE_TAGS :=user eng tests optional
user: 指該模塊只在user版本下才編譯
eng: 指該模塊只在eng版本下才編譯
tests: 指該模塊只在tests版本下才編譯
optional:指該模塊在所有版本下都編譯
取值范圍debug eng tests optional samples shell_ash shell_mksh。注意不能取值user,如果要預裝,則應定義core.mk。
------------------------------------------------------------------------------------------------------------------------------
(4) LOCAL_SRC_FILES := $(call all-java-files-under, src)
(4.1) 如果要包含的是java源碼的話,可以調用all-java-files-under得到。(這種形式來包含local_path目錄下的所有java文件)
(4.2) 當涉及到C/C++時,LOCAL_SRC_FILES變量就必須包含將要編譯打包進模塊中的C或C++源代碼文件。注意,在這里你可以不用列出頭文件和包含文件,因為編譯系統將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好。
all-java-files-under宏的定義是在build/core/definitions.mk中。
------------------------------------------------------------------------------------------------------------------------------
(5) LOCAL_PACKAGE_NAME := Settings
package的名字,這個名字在腳本中將標識這個app或package。
------------------------------------------------------------------------------------------------------------------------------
(6) LOCAL_CERTIFICATE := platform
LOCAL_CERTIFICATE 后面是簽名文件的文件名,說明Settings.apk是一個需要platform key簽名的APK
------------------------------------------------------------------------------------------------------------------------------
(7) include $(BUILD_PACKAGE)
在(2.2)中已作解釋
------------------------------------------------------------------------------------------------------------------------------
(8) include $(call all-makefiles-under,$(LOCAL_PATH))
加載當前目錄下的所有makefile文件,all-makefiles-under會返回一個位於當前'my-dir'路徑的子目錄中的所有Android.mk的列表。
all-makefiles-under宏的定義是在build/core/definitions.mk中。
------------------------------------------------------------------------------------------------------------------------------
這個Android.mk文件最后就生成了Settings.apk。分析完上面的Android.mk文件后,來總結下各種LOCAL_XXX。
三種情況說明:
必須定義, 在app或package的Android.mk中必須給定值。
可選定義,在app或package的Android.mk中可以也可以不給定值。
不用定義,在app或package的Android.mk中不要給定值,腳本自動指定值。
LOCAL_PATH, 當前路徑,必須定義。 LOCAL_PACKAGE_NAME, 必須定義,package的名字,這個名字在腳本中將標識app或package。 LOCAL_MODULE_SUFFIX, 不用定義,module的后綴,=.apk。 LOCAL_MODULE, 不用定義,=$(LOCAL_PACKAGE_NAME)。 LOCAL_JAVA_RESOURCE_DIRS, 不用定義。 LOCAL_JAVA_RESOURCE_FILES, 不用定義。 LOCAL_MODULE_CLASS, 不用定義。 LOCAL_MODULE_TAGS, 可選定義。默認optional。取值范圍user debug eng tests optional samples shell_ash shell_mksh。 LOCAL_ASSET_DIR, 可選定義,推薦不定義。默認$(LOCAL_PATH)/assets LOCAL_RESOURCE_DIR, 可選定義,推薦不定義。默認product package和device package相應的res路徑和$(LOCAL_PATH)/res。 LOCAL_PROGUARD_ENABLED, 可選定義,默認為full,如果是user或userdebug。取值full, disabled, custom。 full_android_manifest, 不用定義,=$(LOCAL_PATH)/AndroidManifest.xml。 LOCAL_EXPORT_PACKAGE_RESOURCES, 可選定義,默認null。如果允許app的資源被其它模塊使用,則設置true。 LOCAL_CERTIFICATE, 可選定義,默認為testkey。最終 private_key := $(LOCAL_CERTIFICATE).pk8 certificate := $(LOCAL_CERTIFICATE).x509.pem
擴展:在一個Android.mk中可以生成多個可執行程序、動態庫和靜態庫。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Any libraries that this library depends on LOCAL_JAVA_LIBRARIES := android.test.runner # The name of the jar file to create LOCAL_MODULE := sample # Build a static jar file. include $(BUILD_STATIC_JAVA_LIBRARY)
LOCAL_PATH := $(call my-dir) #include $(CLEAR_VARS) LOCAL_SRC_FILES := main.c LOCAL_MODULE := test_exe #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_EXECUTABLE)
注:‘:=’是賦值的意思,'+='是追加的意思,‘$’表示引用某變量的值
LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES中加入需要的頭文件搜索路徑 LOCAL_STATIC_LIBRARIES 加入所需要鏈接的靜態庫(*.a)的名稱, LOCAL_SHARED_LIBRARIES 中加入所需要鏈接的動態庫(*.so)的名稱, LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE 表示以一個可執行程序的方式進行編譯。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ helloworld.c LOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_STATIC_LIBRARY)
和上面相似,BUILD_STATIC_LIBRARY 表示編譯一個靜態庫。
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := helloworld.c LOCAL_MODULE := libtest_shared TARGET_PRELINK_MODULES := false #LOCAL_C_INCLUDES := #LOCAL_STATIC_LIBRARIES := #LOCAL_SHARED_LIBRARIES := include $(BUILD_SHARED_LIBRARY)
和上面相似,BUILD_SHARED_LIBRARY 表示編譯一個共享庫。
out/target/product/generic/obj/APPS out/target/product/generic/obj/JAVA_LIBRARIES out/target/product/generic/obj/EXECUTABLE out/target/product/generic/obj/STATIC_LIBRARY out/target/product/generic/obj/SHARED_LIBRARY
每個模塊的目標文件夾分別為:
1)APK程序:XXX_intermediates 2)JAVA庫程序:XXX_intermediates 3)C\C++可執行程序:XXX_intermediates 4)C\C++靜態庫: XXX_static_intermediates 5)C\C++動態庫: XXX_shared_intermediates
參考文章:
講解的很詳細~~
Android.mk簡介
編譯apk的例子~~
Android.mk編譯APK范例
這個講的有點廣,涉及到很多mk文件~~
Android makefile 組織結構