Android下Android.mk檔案解析

來源:互聯網
上載者:User

標籤: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檔案,同樣類型的宏如下:

  • CLEAR_VARS                                             清除LOCAL_xxx變數
  • 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檔案解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.