標籤:linux android makefile android.mk 編譯
1 概述
大家都知道在Linux下編輯經常要寫一個Makefile檔案, 可以把這個Makefile檔案理解成一個編譯設定檔,它儲存著如何編譯的配置資訊,即指導編譯器如何來編譯器,並決定編譯的結果是什麼。而在Android下的Android.mk檔案也是類型的功能,顧名思義,從名字上就可以猜測得到,Android.mk檔案是針對Android的Makefile檔案.具體來說:該檔案是GNU Makefile的一小部分,會被編譯系統解析一次或多次。你可以在每一個Android.mk file中定義一個或多個模組,你也可以在幾個模組中使用同一個原始碼檔案。編譯系統為你處理許多細節問題。
2 Android.mk的整體結構
例如一個Android.mk的內容如下:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= android_media_MediaPlayer.cpp android_media_MediaRecorder.cpp android_media_MediaScanner.cpp android_media_MediaMetadataRetriever.cpp android_media_ResampleInputStream.cpp android_media_MediaProfiles.cpp android_media_AmrInputStream.cpp android_media_Utils.cpp android_mtp_MtpDatabase.cpp android_mtp_MtpDevice.cpp android_mtp_MtpServer.cpp LOCAL_SHARED_LIBRARIES := libandroid_runtime libnativehelper libutils libbinder libmedia libskia libui libcutils libgui libstagefright libcamera_client libsqlite libmtp libusbhost libexifLOCAL_C_INCLUDES += external/jhead external/tremor/Tremor frameworks/base/core/jni frameworks/base/media/libmedia frameworks/base/media/libstagefright/codecs/amrnb/enc/src frameworks/base/media/libstagefright/codecs/amrnb/common frameworks/base/media/libstagefright/codecs/amrnb/common/include frameworks/base/media/mtp $(PV_INCLUDES) $(JNI_H_INCLUDE) $(call include-path-for, corecg graphics)LOCAL_CFLAGS +=LOCAL_LDLIBS := -lpthreadLOCAL_MODULE:= libmedia_jniinclude $(BUILD_SHARED_LIBRARY)# build libsoundpool.so# build libaudioeffect_jni.soinclude $(call all-makefiles-under,$(LOCAL_PATH))
首先必須定義好LOCAL_PATH變數。然後清除所有LOCAL_XX變數的值,當然LOCAL_PATH的值除外,然後定義源檔案,標頭檔,接著是編譯選項參數,緊接著是編譯產生的檔案名稱,最後是產生的檔案類型.
3 Android.mk內的變數定義3.1 LOCAL_PATH
一個Android.mk file首先必須定義好LOCAL_PATH變數。它用於在開發樹中尋找源檔案。例如:
LOCAL_PATH:= $(call my-dir)
宏函數’my-dir’, 由編譯系統提供,用於返回當前路徑(即包含Android.mk file檔案的目錄)
3.2 include $( CLEAR_VARS)
宏CLEAR_VARS 由編譯系統提供,指定讓GNU MAKEFILE為你清除許多LOCAL_XXX變數(例如 LOCAL_MODULE, LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。這是必要的,因為所有的編譯控制檔案都在同一個GNU MAKE執行環境中,所有的變數都是全域的。
3.3 LOCAL_SRC_FILES
本次需要編譯的源檔案
3.4 LOCAL_SHARED_LIBRARIES
本次編譯需要連結的動態連結程式庫檔案,即.so檔案
3.5 LOCAL_STATIC_LIBRARIES
靜態連結庫.
3.6 LOCAL_C_INCLUDES
本次編譯需要包含的標頭檔,一個相對於目前的目錄可選的路徑名單,當編譯所有的源檔案(C,C++和彙編)時,它將被添加進include搜尋路徑。例如:
LOCAL_C_INCLUDES := sources/foo
或者甚至:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
3.6 LOCAL_LDLIBS
本次編譯的連結選項,相當於gcc -l後的參數
3.7 LOCAL_CFLAGS
同樣是編譯選項,相當於gcc -O後面的參數
3.8 LOCAL_MODULE
產生的模組名,這個變數必須定義,表示make後將要產生的檔案的名字
3.9 LOCAL_PACKAGE_NAME
apk檔案名稱
4 include
include可Android多以這樣的形式出現,如:include $( CLEAR_VARS),include $(BUILD_SHARED_LIBRARY).其實這個include可以理解成"執行"的意思,那麼執行什麼呢?當然是看後邊的宏了.
宏CLEAR_VARS已經在3.2節中介紹過了,表示清除一些變數.
宏BUILD_SHARED_LIBRARY表示產生共用庫,即產生.so檔案
因此include $(BUILD_SHARED_LIBRARY)就是指定在/system/lib/目錄下產生一個lib$(LOCAL_MOUDULE).so檔案,同樣類型的宏如下:
- BUILD_SHARED_LIBRARY 在/system/lib/目錄下產生lib$(LOCAL_MOUDULE).so檔案
- BUILD_STATIC_LIBRARY 產生lib$(LOCAL_MOUDULE).a檔案
- BUILD_EXECUTABLE 在/system/bin/目錄下產生可執行檔
- BUILD_PACKAGE 編譯成一個apk檔案
Android下Android.mk檔案解析