Android.mk 配置參數

Android.mk 的可配置參數會比較多,可是經常使用的可能不多。在進行多項目 ndk 共享的時候,若是對各個參數比較瞭解,對項目的結構優化有不小的好處。android

0x00 LOCAL_PATH

根據 Android 構建系統要求,Android.mk 文檔必須以 LOCAL_PATH 變量的定義開頭。安全

LOCAL_PATH := $(call my-dir)

Android 構建系統利用 LOCAL_PATH 來定位源文件。由於將改變量設置爲硬編碼值不合適,因此 Android 構建系統提供了一個名爲 my-dir 的宏功能。經過將該變量設置爲 my-dir 宏功能的返回值,能夠將其放在當前目錄下。函數

0x01 CLEAR_VARS

Android 構建系統將 CLEAR_VARS 變量設置爲 clear-vars.mk 片斷的位置。包含 Makefile 片斷能夠清除除了 LOCAL_PATH 之外的LOCAL_name 變量,例如 LOCAL_MODULE 與 LOCAL_SRC_FILE 等。優化

Include $(CLEAR_VARS)

這樣作是由於 Android 構建系統能夠在單次執行中解析多個構建文件和模式定義,LOCAL_<name> 是全局變量。清除它們能夠避免衝突,每個原生組件被稱爲一個模塊。ui

0x02 LOCAL_MODULE

改變了是用來給這些模塊設定一個惟一的名稱。下面的代碼將該模塊的名稱設爲 hello-jni:this

LOCAL_MODULE := hello-jni

由於模塊名稱也被用於給構建過程的所生成的文件命名,因此構建系統給文件添加適當的前綴和後綴。本例中, hello-jni 模塊會生成一個共享文件且構建系統會將它命名爲 libhello-jni.so。編碼

0x03 LOCAL_SRC_FILES

該變量用來創建和組裝這個模塊的源文件列表。debug

LOCAL_SRC_FILES := hello-jni.c

這裏,hello-jni 模塊只有一個源文件生成,而 LOCAL_SRC_FILES 變量能夠包含用空格分開的多個源文件名。code

0x04 BUILD_SHARED_LIBRARY

爲了創建可供主應用程序使用的模塊,必須將該模塊變成共享庫。Android NDK 構建系統將 BUILD_SHARED_LIBRARY 變量設置成 build_shared_libray.mk 文件保存的位置。改 Makefile 片斷包含了將源文件構建和組裝成共享庫的必要過程。orm

include $(BUILD_SHARED_LIBRARY)

0x05 BUILD_STATIC_LIBRARY

創建靜態庫,Android 應用並不直接使用靜態庫,通常是將第三方代碼做爲靜態庫引入動態庫中使用。

include $(BUILD_STATIC_LIBRARY)

0x06 引入共享庫和靜態庫

LOCAL_SHARED_LIBRARY := avilib_share
LOCAL_STATIC_LIBRARY := avilib_static

0x07 多項目共享模塊

多個項目共享某個模塊時,先將源碼導入%NDK_HOME%/source,配置好對應的 Android.mk 文件。在須要的項目中添加:

LOCAL_SHARED_LIBRARIES := avilib
$(call import-module, transcode/avilib)

0x08 用 Prebuilt 庫

將已編譯好的 so 文件做爲項目的共享模塊:

LOCAL_PATH := $(call my-dir)
#第三方模塊
include $(CLEAR_VARS)
LOCAL_MODULE := avilib
LOCAL_SRC_FILES := libavilib.so

include $(RREBUILT_SHARED_LIBRARY)

0x09 構建可執行文件

include $(BUILD_EXECUTABLE)

0x10 其餘構建系統變量

#目標 CPU 體系結構名稱
TARGET_ARCH := arm

#目標 Android 平臺名稱
TARGET_PLARFORM := andoid-3

#目標 CPU 體系結構和 ABI 名稱
TARGET_ARCH_ABI := armeabi-v7a

#目標平臺和 ABI 串聯
TARGET_ABI := android-3-armeabi-v7a

#重定向輸出文件名(默認爲 LOCAL_MODULE)
LOCAL_MODULE_FILENAME := avilib

#指定 C++ 源碼文件擴展名
LOCAL_CPP_EXTENSION := .cpp .cxx

#指定模塊所依賴的具體 C++ 特性
LOCAL_CPP_FEATURES := rtti

#可選目錄列表,NDK安裝目錄的相對路徑,用來搜索頭文件
LOCAL_C_INCLUDES := sources/shared-module

#添加編譯器標誌(添加宏定義)
LOCAL_CFLAGS := -DNDEBUG -DPROT=1234

#添加編譯器標誌(添加宏定義)僅C++
LOCAL_CPP_CFLAGS := -DNDEBUG -DPROT=1234

#LOCAL_STATIC_LIBRARY變體,全部靜態庫內容(當幾個靜態庫有循環依賴的時候頗有用)
LOCAL_WHOLE_STATIC_LIBRARY := avilib bvilib

#連接標誌的可選列表
LOCAL_LDLIBS := -llog

#禁止生產文件中進行缺失符號檢查
LOCAL_ALLOW_UNDEFINED_SYMBOLS :

#指定要生成的 ARM 二進制類型
LOCAL_ARM_MODE := arm

#開啓 NEON 指令
LOCAL_ARM_NEON := true

#禁用 NX bit 安全特性(Never Execute)
LOCAL_DISABLE_NO_EXECUTE := true

#記錄一組編譯器標誌
LOCAL_EXPORT_CFLAGS := -DENABLE_AUDIO

#與上面類型,僅用於 C++
LOCAL_EXPORT_CPPFLAGS := -DENABLE_AUDIO

#與 LOCAL_EXPORT_CFLAGS 類型用於連接器標誌
LOCAL_EXPORT_LDFLAGS := -DENABLE_AUDIO

#容許記錄路徑集
LOCAL_EXPORT_C_INCLUDES :=

#用於有大量資源或者獨立的靜態庫/動態庫的模塊,分解命令長度
LOCAL_SHORT_COMMANDS := true

#定義了用於過濾來至 LOCAL_SRC_FILES變量的裝配文件的應用程序
LOCAL_FILTER_ASM :=

0x11 其餘構建系統函數宏

#返回當前目錄下的全部子目錄下的 Android.mk 構建文件列表
include $(call all-subdir-makefiles)

#放回當前 Android.mk 構建文件的路徑
this-makefile

#返回包含當前構建文件的父 Android.mk 構建文件路徑
parent-makefile

#和 parent-makefile 同樣但用於祖父目錄
grand-parent-makefile

0x12 定義新變量

LOCAL_ 和 NDK_ 開頭的爲預留構建名稱,可以使用 MY_ 開頭的變量

MY_SRC_FILES := avilib.c platform_posix.c

LOCAL_SRC_FILES := $(addprefix avilib/, $(MY_SRC_FILES))

0x13 條件操做

在每一個體繫結構中包含一個不一樣的源碼文件集

ifeq ($(TARGET_ARCH), arm)
    LOCAL_SRC_FILES += armonly.c
else
    LOCAL_SRC_FILES += generic.c
endif

0x14 Application.mk

#覆蓋 Android.mk 構建的模塊列表
APP_MODULES := avilib 

#設置二進制文件的優化級別,默認 release
APP_OPTIM := relase / debug

#編譯器標誌
APP_CLAGS

#編譯器標誌,做用於 C++ 源文件
APP_CPPLAGS

#從非 jni 子目錄下查找 Android.mk 構建文件
APP_BUILD_SCRIPT

#構建系統的二進制文件,默認 armeabi ABI
APP_ABI := all / armeabi mips

#使用不一樣 STL 實現庫,默認 system 庫
APP_STL := stlport_shared

#與 LOCAL_CPP_EXTENSIONS 變量類似,代表全部模塊都依賴與具體的 C++ 特性,如 RTTI,exceptions
APP_GUNSTL_FORCE_CPP_FEATURES

#與 LOCAL_SHORT_COMMANDS 變量相似
APP_SHORT_COMMANDS

原文地址: Android.mk 配置參數

相關文章
相關標籤/搜索