1. 程式人生 > >Android.mk語法

Android.mk語法

官方文件
位於jni目錄下。用於向構建系統 描述sources和share libraries。相當於一個小版本的GNU makefile片段。

Android.mk允許你組織source到modules裡,modules可以指stati library、share ilbrary或者單獨的可執行檔案(standalone executable)。

其可定義多個module,可以多個modules公用一個source file。構建系統只是將shared librarie放到你的應用包中。另外,static libraries可以生成shared libraries。

NDK構建系統自動處理依賴關係,不需要指定 標頭檔案、顯式的依賴。

Variables and Macros

可自定義變數,不可用系統保留名:

  1. 名字以LOCAL_ 字首
  2. PRIVATE_ NDK_ APP 的字首,構建系統內部使用
  3. 小寫字母,如 my-dir
    推薦用MY_字首

NDK-defined include variables

在解析Android.mk檔案前編譯系統已定義好的GNU Make變數。在一些情況下,NDK會多次解析Android.mk,期間variable的值可能不同。

CLEAR_VARS
include $(CLEAR_VARS)

clean LOCAL_XXX的引數(如LOCAL_MODULE, LOCAL_SRC_FILES

, 和 LOCAL_STATIC_LIBRARIES),但不cleanLocal_PATH
因為執行一個單獨的GNU執行上下文,所有的local vairable都是全域性的,所以需要配置module前clean下。

BUILD_SHARED_LIBRARY

該varaibel指向構建target為shared library的指令碼,該指令碼收集你提供的LOCAL_XXX引數,用於構建shared library。

注意該指令碼需要至少定義LOCAL_MODULE and LOCAL_SRC_FILES構建字尾.so

BUILD_STATIC_LIBRARY

同上,只是用於構建stati library。
不會cop static library到你的projec、packages,但是可以用來build shared libraries(see LOCAL_STATIC_LIBRARIES and LOCAL_WHOLE_STATIC_LIBRARIES)。
生成.a 字尾library

PREBUILT_SHARED_LIBRARY

LOCAL_SRC_FILES不作為source file,而是一個單獨的執行share library的路徑,如 foo/libfoo.so
也可以在別的module醫用prebuit library(用LOCAL_PREBUILTS

PREBUILT_STATIC_LIBRARY

類比PREBUILT_SHARED_LIBRARY

Target information variables

TARGET_ARCH

CPU家族 arm, arm64, x86, or x86_64.

TARGET_PLATFORM

Android API level number, Android 5.1 對應22:android-22

ifeq ($(TARGET_PLATFORM),android-22)
    # ... do something ...
endif
TARGET_ARCH_ABI

supported CPU and architecture.
CPU and architecture Setting
ARMv7 armeabi-v7a
ARMv8 AArch64 arm64-v8a
i686 x86
x86-64 x86_64

example:

    ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
      # \... do something \...
    endif

描述模型的引數

通過variable向構建系統描述你的module,需要遵循如下步驟

  1. 使用CLEAR_VARS引數 初始化或undefine model的 variables
  2. 給variable賦值
  3. 設定合適的buil指令碼,使用BUILD_XXX變數 (上文中的變數)
LOCAL_PATH

指定當前檔案的路徑,CLEAR_VARS不會清除該variable。

LOCAL_PATH := $(call my-dir)

必須定義LOCAL_PATH
my-dir事macro fucntion,由構建系統提供。返回當前路徑(Android.mk的父路徑)

LOCAL_CPP_EXTENSION

更改C++ sourc file預設字尾.cpp

LOCAL_CPP_EXTENSION := .cxx .cpp .cc

LOCAL_MODULE

module名稱,預設生成的library名稱,為module名稱加 lib字首、.so或.a字尾

LOCAL_MODULE_FILENAME

指定modul出的library名稱

LOCAL_MODULE := foo
LOCAL_MODULE_FILENAME := libnewfoo
LOCAL_SRC_FILES

compile module使用的source file。會自動依賴,相對於 LOCAL_PATH的相對路徑,或絕對路徑。

LOCAL_EXPORT_CFLAGS

記錄C/C++的compiler flags給通過LOCAL_STATIC_LIBRARIES or LOCAL_SHARED_LIBRARIES 依賴的module的 LOCAL_CFLAGS

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_CFLAGS := -DFOO=1
include $(BUILD_STATIC_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_CFLAGS := -DBAR=2
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

compile bar.c時,flags -DFOO=1 and -DBAR=2傳遞給compiler.
但是compile foo.c時不會有-DFoo=1這個flag

LOCAL_CPP_FEATURES

指定c++ features,優於LOCAL_CPPFLAGS直接定義-frtti and -fexceptions,LOCAL_CPPFLAGS導致compiler應用於所有的module,而不管是否需要
For prebuilt binaries, this variable also declares which features the binary depends on, thus helping ensure the final linking works correctly

LOCAL_CPP_FEATURES := rtti
LOCAL_CPP_FEATURES := exceptions
LOCAL_CPP_FEATURES := rtti features
LOCAL_C_INCLUDES

指定list of paths,相對於NDK的root目錄,新增include搜尋路徑 在編譯sources 時

LOCAL_C_INCLUDES := sources/foo
LOCAL_C_INCLUDES := $(LOCAL_PATH)/<subdirectory>/foo

在設定LOCAL_CFLAGS or LOCAL_CPPFLAGS前定義。

系統使用的LOCAL_C_INCLUDES 當通過ndk-gdb進行native debug時

LOCAL_STATIC_LIBRARIES

當前module依賴的static libraries module列表。
當前module是shared library or
an executable,將強制其static libraries連線到最終的binary(二進位制檔案)內
當前是static library,僅僅表明依賴於當前module的module也將依賴於 這個variable的資料(static libraries)

LOCAL_CFLAGS

設定compiler flags當build c c++原始碼時。 LOCAL_CPPFLAGS 只用於C++

LOCAL_CFLAGS += -I<path>,
LOCAL_LDLIBS

執行時需要的系統庫(-l作為庫的字首)

LOCAL_LDLIBS := -lz

如上告訴linker生成的module在載入的時候link /system/lib/libz.so

LOCAL_EXPORT_LDLIBS

傳遞系統的libraries給compiler,在library前加L

舉例:foo作為static library,依賴於系統庫。使用它去匯出依賴。

include $(CLEAR_VARS)
LOCAL_MODULE := foo
LOCAL_SRC_FILES := foo/foo.c
LOCAL_EXPORT_LDLIBS := -llog
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := bar
LOCAL_SRC_FILES := bar.c
LOCAL_STATIC_LIBRARIES := foo
include $(BUILD_SHARED_LIBRARY)

當構建libbar.so時,使用-llog在linker命令的後面。這相當於告訴libbar.so依賴於foo,所以也依賴於系統logging library

NDK-provided function macros

my-dir

返回最近include的makefile,的路徑,常用來定義LOCAL_PATH

其他的先省略,以後寫吧