Android.mk文件筆記

一、android.mk文件

用實驗中mk文件簡單分析下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := wiredphone.c

LOCAL_MODULE := wriedphone.$(TARGET_BOARD_PLATFORM)
LOCAL_MODULE_TAGS := optional
#LOCAL_MODULE := libwriedphone

LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw

include $(BUILD_SHARED_LIBRARY)


LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# 變量設置爲false那麼將不做prelink操作 

LOCAL_PRELINK_MODULE := false


LOCAL_SRC_FILES:= \
	WRIEDPHONEService.cpp


LOCAL_SHARED_LIBRARIES := \
	libutils \
	libbinder \
	libhardware \


LOCAL_MODULE:= libled


LOCAL_MODULE_TAGS := optional


include $(BUILD_SHARED_LIBRARY)


1、LOCAL_MODULE_TAGS :=user eng tests optional

user: 用戶模式,指該模塊只在user版本下才編譯

eng: 工程模式,指該模塊只在eng版本下才編譯

tests: 指該模塊只在tests版本下才編譯

optional:指該模塊在所有版本下都編譯


2、LOCAL_PRELINK_MODULE := false

預編譯,變量設置爲false那麼將不做prelink操作 


3、include $(BUILD_SHARED_LIBRARY)、$(BUILD_STATIC_LIBRARY)、$(BUILD_EXECUTABLE)


BUILD_SHARED_LIBRARY:動態共享庫


BUILD_STATIC_LIBRARY:靜態庫


BUILD_EXECUTABLE:可執行程序


BUILD_PACKAGE:生成一個APK


eg:LOCAL_SRC_FILES := foo.c toto/bar.c\
        Hello.c
        文件之間可以用空格或Tab鍵進行分割,換行請用"\",如果是追加源代碼文件的話,請用LOCAL_SRC_FILES +=。
注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來包含local_path目錄下的所有java文件。


4、LOCAL_PATH:= $(call my-dir) 

        一個Android.mk file首先必須定義好LOCAL_PATH變量。它用於在開發樹中查找源文件。

在這個例子中,宏函數‘my-dir’,  由編譯系統提供,用於返回當前路徑(即包含Android.mk file
文件的目錄)。

5、include$(CLEAR_VARS) 
CLEAR_VARS由編譯系統提供(可以在android安裝目錄下的/build/core/config.mk 文件看
到其定義,爲CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk),指定讓GNU MAKEFILE
爲你清除許多LOCAL_XXX 變量( 例如LOCAL_MODULE,LOCAL_SRC_FILES,Android.mk文檔規範2 LOCAL_STATIC_LIBRARIES,等等…),除LOCAL_PATH。這是必要的,因爲所有的編譯控制文件都在同一個GNU MAKE執行環境中,所有的變量都是全局的。


6、LOCAL_MODULE:= helloworld 
LOCAL_MODULE變量必須定義,以標識你在Android.mk文件中描述的每個模塊。名稱
必須是唯一的,而且不包含任何空格。注意編譯系統會自動產生合適的前綴和後綴,換句話
說,一個被命名爲'foo'的共享庫模塊,將會生成'libfoo.so'文件。注意:如果把庫命名爲
‘libhelloworld’,編譯系統將不會添加任何的lib 前綴,也會生成libhelloworld.so,這是
爲了支持來源於Android平臺的源代碼的Android.mk文件。


7、LOCAL_SRC_FILES:= helloworld.c 
LOCAL_SRC_FILES變量必須包含將要編譯打包進模塊中的C或C++源代碼文件。不用在這裏列出頭文件和包含文件,編譯系統將會自動找出依賴型的文件。注意:可以LOCAL_SRC_FILES := $(call all-subdir-java-files)這種形式來包含local_path目錄下的所有java文件。默認的C++源碼文件的擴展名是‘.cpp’。指定一個不同的擴展名也是可能的,只要定義LOCAL_DEFAULT_CPP_EXTENSION變量,不要忘記開始的小圓點(也就是定義爲  ‘.cxx’,而不是‘cxx’)


8、LOCAL_OVERRIDES_PACKAGES

此變量可以使其他的模塊不加入編譯,如源碼中DeskClock的android.mk有LOCAL_OVERRIDES_PACKAGES := 

 AlarmClock,使 AlarmClock不會加入到編譯系統中,不會生成 AlarmClock.apk。


9、include $(call all-subdir-makefiles)
它的作用就是包含所有子目錄中的Android.mk文件,如果需要編譯的模塊比較多,我們可能會將對應的模塊放置在相應的目錄中,這樣,我們可以在每個目錄中定義對應的Android.mk文件(類似於上面的寫法),最後,在根目錄放置一個Android.mk文件,加入include $(call all-subdir-makefiles)


10、LOCAL_MODULE_PATH
在Android.mk文件中,還可以指定最後的目標安裝路徑,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定。不同的文件系統路徑用以下的宏進行選擇:
  TARGET_ROOT_OUT:表示根文件系統。
  TARGET_OUT:表示system文件系統。
  TARGET_OUT_DATA:表示data文件系統。
  用法如:
  LOCAL_MODULE_PATH:=$(TARGET_ROOT_OUT)
    MY_SOURCES += bar.c


11、LOCAL_CFLAGS
LOCAL_CFLAGS := -DHHH 這個等價於頭文件中 #define HHH
可選的編譯器選項,在編譯C代碼文件的時候使用。這可能是有用的,指定一個附加的包含路徑(相對於NDK的頂層目錄),宏定義,或者編譯選項。


  重要信息:不要在Android.mk中改變 optimization/debugging級別,只要在Application.mk中指定合適的信息,就會自動地爲你處理這個問題,在調試期間,會讓NDK自動生成有用的數據文件。(7) LOCAL_CXXFLAGS: Same as LOCAL_CFLAGS for C++ source files


12、LOCAL_CPPFLAGS: 與LOCAL_CFLAGS相同,但是對C 和C++ source files都適用。


13、LOCAL_C_INCLUDES

 可選變量,表示頭文件的搜索路徑。默認的頭文件的搜索路徑是LOCAL_PATH目錄。


14、LOCAL_JNI_SHARED_LIBRARIES

定義了要包含的so庫文件的名字,如果程序沒有采用jni,不需要

LOCAL_JNI_SHARED_LIBRARIES := libxxx 這樣在編譯的時候,NDK自動會把這個libxxx打包進apk; 放在youapk/lib/目錄下

二、自定義變量
 以下是在 Android.mk中依賴或定義的變量列表,可以定義其他變量爲自己使用,但是NDK編譯系統保留下列變量名:
 -以 LOCAL_開頭的名字(例如 LOCAL_MODULE)
 -以 PRIVATE_, NDK_ 或 APP_開頭的名字(內部使用)
 -小寫名字(內部使用,例如‘my-dir’)
  如果爲了方便在 Android.mk 中定義自己的變量,建議使用 MY_前綴,一個小例子:
MY_SOURCES := foo.c
ifneq ($(MY_CONFIG_BAR),)
 MY_SOURCES += bar.c
endif
LOCAL_SRC_FILES += $(MY_SOURCES)
注意:‘:=’是賦值的意思;'+='是追加的意思;‘$’表示引用某變量的值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章