Android.mk語法規範

原帖地址

http://www.2cto.com/kf/201309/246706.html


變量解析:
LOCAL_PATH:=$(call my-dir)
LOCAL_PATH表示此時位於工程目錄的根目錄中,(call my-dir)的功能由編譯器提供,被用來返回當前目錄的地址(這裏的當前目錄裏包含
 
Android.mk這個文件本身)。
 
include $(CLEAR_VARS)
CLEAR_VARS這個變量由編譯器提供,並且指明瞭一個GNU Makefile文件,這個功能會清理掉所有以LOCAL_開頭的內容(例如 LOCAL_MODULE、
 
LOCAL_FILES、LOCAL_STATIC_LIBRARIES等),除了LOCAL_PATH。這句話是必須的,因爲如果所有的變量都是全局的,所有的可控的編譯文件
 
都需要在一個單獨的GNU中被解析並執行。
 
LOCAL_SRC_FILES變量必須包含一個C、C++或者java源文件的列表,這些會被編譯並聚合到一個模塊中。只要列出要傳遞給編譯器的文件,因
 
爲編譯系統自動計算依賴。注意源代碼文件名稱都是相對於 LOCAL_PATH的,你可以使用路徑部分,例如:
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文件。
 
LOCAL_MODULE 變量必須被定義,用來區分android.mk中的每一個模塊。文件名必須是唯一的,不能有空格。注意,這裏編譯器會爲你自動加
 
上一些前綴和後綴,來保證文件是一致的。
BUILD_EXECUTABLE這個變量是由系統提供的,並且制定給GNU Makefile的腳本,它可以收集所有你定義的“include $(CLEAR_VARS)”中以
 
LOCAL_開頭的變量,並且決定哪些要被編譯,哪些應該做的更加準確。表示將編譯生成一個可執行文件。
我們同樣也可以使用:
BUILD_SHARED_LIBRARY來生成一個動態庫;
BUILD_STATIC_LIBRARY來生成一個靜態的庫;
BUILD_PACKAGE來生成一個APK;
LOCAL_OVERRIDES_PACKAGES此變量可以使其他的模塊不加入編譯,如源碼中DeskClock的android.mk有LOCAL_OVERRIDES_PACKAGES := 
 
AlarmClock,使 AlarmClock不會加入到編譯系統中,不會生成 AlarmClock.apk。
 
LOCAL_STATIC_LIBRARIES: 表示該模塊需要使用哪些靜態庫,以便在編譯時進行鏈接。
LOCAL_SHARED_LIBRARIES:  表示模塊在運行時要依賴的共享庫(動態庫),在鏈接時就需要,以便在生成文件時嵌入其相應的信息。
注意:它不會附加列出的模塊到編譯圖,也就是仍然需要在Application.mk 中把它們添加到程序要求的模塊中。
LOCAL_LDLIBS:  編譯模塊時要使用的附加的鏈接器選項。這對於使用‘-l’前綴傳遞指定庫的名字是有用的。
例如,LOCAL_LDLIBS := -lz表示告訴鏈接器生成的模塊要在加載時刻鏈接到/system/lib/libz.so
可查看 docs/STABLE-APIS.TXT 獲取使用 NDK發行版能鏈接到的開放的系統庫列表。
LOCAL_LDLIBS :鏈接的庫不產生依賴關係,一般用於不需要重新編譯的庫,如庫不存在,則會報錯找不到。且貌似只能鏈接那些存在於系統
 
目錄下本模塊需要連接的庫。如果某一個庫既有動態庫又有靜態庫,那麼在默認情況下是鏈接的動態庫而非靜態庫。
如:LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog 
如果需要指定鏈接庫的路徑則直接在後面寫 -L再加路徑即可
LOCAL_SHARED_LIBRARIES 會生成依賴關係,當庫不存在時會去編譯這個庫。
LOCAL_LDFLAGS:這個編譯變量傳遞給鏈接器一個一些額外的參數,比如想傳遞而外的庫和庫路徑給ld,或者傳遞給ld linker的一些鏈接參數
 
,-On,-EL{B}(大小端字節序),那麼就要加到這個上面,如:
LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} …
或者直接加上絕對路徑庫的全名:
LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n}
include $(call all-subdir-makefiles)
它的作用就是包含所有子目錄中的Android.mk文件
如果需要編譯的模塊比較多,我們可能會將對應的模塊放置在相應的目錄中,
這樣,我們可以在每個目錄中定義對應的Android.mk文件(類似於上面的寫法),
最後,在根目錄放置一個Android.mk文件,加入include $(call all-subdir-makefiles)
 
TARGET_ARCH指架構中CPU的名字已經被android開源代碼明確指出了。這裏的ARM包含了任何ARM-獨立結構的架構,以及每個獨立的CPU的版本
 
TARGET_PLATFORM: Android.mk 解析的時候,目標 Android 平臺的名字.
android-3 -> Official Android 1.5 system images
android-4 -> Official Android 1.6 system images
android-5 -> Official Android 2.0 system images
TARGET_ARCH_ABI:  暫時只支持兩個 value,armeabi 和 armeabi-v7a
TARGET_ABI: 目標平臺和 ABI 的組合
 
 
LOCAL_C_INCLUDES:  可選變量,表示頭文件的搜索路徑。默認的頭文件的搜索路徑是LOCAL_PATH目錄。
 
LOCAL_MODULE_PATH 和 LOCAL_UNSTRIPPED_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)
LOCAL_JNI_SHARED_LIBRARIES:定義了要包含的so庫文件的名字,如果程序沒有采用jni,不需要
LOCAL_JNI_SHARED_LIBRARIES := libxxx 這樣在編譯的時候,NDK自動會把這個libxxx打包進apk; 放在yourapk/lib/目錄下
 
LOCAL_CFLAGS可選的編譯器選項,在編譯C代碼文件的時候使用。這可能是有用的,指定一個附加的包含路徑(相對於NDK的頂層目錄),宏定義
 
,或者編譯選項。注意:不要在Android.mk中改變optimization/debugging級別,只要在Application.mk中指定合適的信息,就會自動地爲你
 
處理這個問題,在調試期間,會讓NDK自動生成有用的數據文件。
LOCAL_CXXFLAGS與LOCAL_CFLAGS相同,針對C++源文件。
LOCAL_CPPFLAGS與LOCAL_CFLAGS相同,但是對C和C++sourcefiles都適用。
 
NDK提供的函數宏:
my-dir:返回當前 Android.mk 所在的目錄的路徑,相對於 NDK 編譯系統的頂層。這是有用的,在 Android.mk 文件的開頭如此定義:
LOCAL_PATH := $(call my-dir)
all-subdir-makefiles: 返回一個位於當前'my-dir'路徑的子目錄中的所有Android.mk的列表。
this-makefile:  返回當前Makefile 的路徑(即這個函數調用的地方)
parent-makefile:  返回調用樹中父 Makefile 路徑。即包含當前Makefile的Makefile 路徑。
grand-parent-makefile:返回調用樹中父Makefile的父Makefile的路徑
 
在Android.mk中,“:=”是賦值的意思;“+=”是追加的意思;“$”表示引用某變量的值。
Android.mk給變量賦值,同時用的“:=”和“=”,他們分別代表什麼意思呢?
“:=” 的意思是,它右邊賦得值如果是變量,只能使用在這條語句之前定義好的,而不能使用本條語句之後定義的變量;
“=”,當它的右邊賦值是變量時,這個變量的定義在本條語句之前或之後都可以;
 
常見錯誤及解決辦法:
fatal error: string: No such file or directory 
解決辦法:增加Application.mk 寫 APP_STL :=gnustl_static
 
error: 'pthread_rwlock_t' does not name a type
在Application.mk中添加改寫application.mk文件,把版本改成9或更高,APP_PLATFORM := android-9     //對應2.3.1;
在Android API < 9時,採用android NDK編譯代碼是不支持pthread_rwlock_t結構體的。
 
Ndk編譯curl:
下載源碼:http://curl.haxx.se/download.html
./configure --host=arm-linux CC=arm-linux-gnueabi-gcc --prefix=//home/usrhome/johnny.he/androidworkspace/curl_install
make;  make install

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章