1、 設置當前模塊的編譯路徑爲當前文件夾路徑
LOCAL_PATH := $(call my-dir)
2、清理(可能由其他模塊設置過的)編譯環境中用到的變量
include $(CLEAR_VARS)
3、模塊編譯變量
變量 用途
LOCAL_SRC_FILES 當前模塊包含的源代碼文件
LOCAL_MODULE 當前模塊的名稱,這個名稱應當是唯一的,模塊間的依賴關係就是通過這個名稱來引用的
LOCAL_C_INCLUDES C/C++ 語言需要的頭文件的路徑
LOCAL_STATIC_LIBRARIES 當前模塊在靜態編譯時,需要的靜態庫
LOCAL_SHARED_LIBRARIES 當前模塊在運行時依賴的動態庫
LOCAL_CFLAGS C/C++編譯器的參數
include $(BUILD_EXECUTABLE)
# -I$(LOCAL_C_INCLUDES) 指定頭文件搜索路徑
# -l$(LOCAL_SHARED_LIBRARIES) 指令鏈接的動態庫
gcc $(LOCAL_CFLAGS) $(LOCAL_SRC_FILES) -o $(LOCAL_MODULE) -I$(LOCAL_C_INCLUDES) $(LOCAL_STATIC_LIBRARIES) -l$(LOCAL_SHARED_LIBRARIES)
LOCAL_JAVA_LIBRARIES 當前模塊依賴的Java共享庫
LOCAL_STATIC_JAVA_LIBRARIES 當前模塊依賴的Java靜態庫
LOCAL_PACKAGE_NAME 當前模塊的APK應用的名稱
LOCAL_CERTIFICATE 簽署當前應用的證書名稱
LOCAL_MODULE_TAGS 當前模塊所包含的標籤,Android.mk的必選,一個模塊可以包含多個標籤
標籤的值可能是debug, eng, tests, samples 或 optional
build/core/definitions.mk
通常會用下面函數獲取上面環境變量的值:
提供配置編譯需要的函數
$(call my-dir) 獲取當前文件夾路徑
$(call all-subdir-java-files) 獲取當前目錄子目錄下所有的java源代碼文件
$(call all-java-files-under, 目錄) 獲取指定目錄下的所有Java文件
$(call all-c-files-under, 目錄) 獲取指定目錄下的所有C語言文件
$(call all-Iaidl-files-under, 目錄) 獲取指定目錄下的所有 AIDL 文件
$(call all-makefiles-under, 目錄) 獲取指定目錄下的所有Make文件
4、模塊類型
BUILD_EXECUTABLE 編譯目標機上的可執行文件(ELF)
BUILD_STATIC_LIBRARY 編譯目標機上的靜態庫(*.a 編譯時使用)
BUILD_SHARED_LIBRARY 編譯目標機上的動態庫文件(*.so)
BUILD_JAVA_LIBRARY 編譯目標機上的java動態庫
BUILD_STATIC_JAVA_LIBRARY 編譯目標機上的java靜態庫
BUILD_PACKAGE 編譯目標機上的java包
5、幾個常見的模板
- 編譯可執行程序的模板
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表示編譯一個共享庫。
以上三者的生成結果分別在如下,generic依具體target會變:
out/target/product/xxxx/obj/EXECUTABLE
out/target/product/xxxxx/obj/STATIC_LIBRARY
out/target/product/xxxx/obj/SHARED_LIBRARY
每個模塊的目標文件夾分別爲:
1.可執行程序:XXX_intermediates
2.靜態庫:XXX_static_intermediates
3.動態庫:XXX_shared_intermediates
- 編譯一個簡單apk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_PACKAGE_NAME := LocalPackage
include $(BUILD_PACKAGE)
- Android Studio項目在源碼中Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_CERTIFICATE := platform
LOCAL_PACKAGE_NAME := Demo
LOCAL_DEX_PREOPT = true
LOCAL_MULTILIB :=both
src_dir = app/src/main/java
res_dir = app/src/main/res
libs_dir = app/libs
LOCAL_MANIFEST_FILE := app/src/main/AndroidManifest.xml
LOCAL_SRC_FILES := $(call all-java-files-under, $(src_dir))
#LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-v4 \
android-support-v7-appcompat \
android-support-v7-cardview \
gson \
okio \
okhttp \
android-support-v7-recyclerview \
android-support-v7-palette
LOCAL_RESOURCE_DIR := \
$(LOCAL_PATH)/$(res_dir) \
frameworks/support/v7/appcompat/res \
frameworks/support/v7/cardview/res \
frameworks/support/v7/recyclerview/res
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
--extra-packages android.support.v7.appcompat \
--extra-packages android.support.v7.cardview \
--extra-packages android.support.v7.recyclerview
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
# Use the folloing include to make our test apk.
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := gson:app/libs/gson-2.7.jar \
okio:app/libs/okio-1.6.0.jar \
okhttp:app/libs/okhttp-3.2.0.jar
include $(BUILD_MULTI_PREBUILT)
##################################################
include $(call all-makefiles-under,$(LOCAL_PATH))