Android的編譯系統生成文件(Android.mk)寫法

 

android編譯系統的makefile文件Android.mk寫法如下

(1)Android.mk文件首先需要指定LOCAL_PATH變量,用於查找源文件。由於一般情況下
Android.mk和需要編譯的源文件在同一目錄下,所以定義成如下形式:
LOCAL_PATH:=$(call my-dir) 
上面的語句的意思是將LOCAL_PATH變量定義成本文件所在目錄路徑。

(2)Android.mk中可以定義多個編譯模塊,每個編譯模塊都是以include $(CLEAR_VARS)開始
以include $(BUILD_XXX)結束
include $(CLEAR_VARS) 
CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變量,
如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。
include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫
include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。
include $(BUILD_EXECUTABLE)表示編譯成可執行程序

(3)舉例如下(框架/底座/庫/ audioflinger / Android.mk):
LOCAL_PATH:= $(叫我- DIR)
包括$(CLEAR_VARS)模塊一
IFEQ($(AUDIO_POLICY_TEST),TRUE)
  ENABLE_AUDIO_DUMP:= TRUE 
ENDIF 
LOCAL_SRC_FILES:= \ 
    AudioHardwareGeneric.cpp \ 
    AudioHardwareStub.cpp \ 
    AudioHardwareInterface.cpp 
IFEQ($(ENABLE_AUDIO_DUMP),TRUE)
  LOCAL_SRC_FILES + = AudioDumpInterface.cpp 
  LOCAL_CFLAGS + =-DENABLE_AUDIO_DUMP 
ENDIF 
LOCAL_SHARED_LIBRARIES:= \ 
    libcutils \ 
    libutils \ 
    libbinder \ 
    libmedia \ 
    libhardware_legacy 
IFEQ ($(條$(BOARD_USES_GENERIC_AUDIO)),TRUE)
  LOCAL_CFLAGS + =-DGENERIC_AUDIO 
ENDIF 
LOCAL_MODULE:= libaudiointerface 
IFEQ($(BOARD_HAVE_BLUETOOTH),TRUE)
  LOCAL_SRC_FILES + = A2dpAudioInterface.cpp 
  LOCAL_SHARED_LIBRARIES + = liba2dp 
  LOCAL_CFLAGS + =-DWITH_BLUETOOTH-DWITH_A2DP 
  LOCAL_C_INCLUDES + = $(調用包括路徑換,bluez的)
ENDIF 
包括$(BUILD_STATIC_LIBRARY)模塊一編譯成靜態庫
包括$(CLEAR_VARS)模塊二
LOCAL_SRC_FILES:= \ 
    AudioPolicyManagerBase.cpp 
LOCAL_SHARED_LIBRARIES:= \ 
    libcutils \ 
    libutils \ 
    libmedia 
IFEQ($ (TARGET_SIMULATOR),TRUE)
 LOCAL_LDLIBS + =-LDL 
否則
 LOCAL_SHARED_LIBRARIES + = libdl 
ENDIF 
LOCAL_MODULE:= libaudiopolicybase 
IFEQ($(BOARD_HAVE_BLUETOOTH),TRUE)
  LOCAL_CFLAGS + =-DWITH_A2DP 
ENDIF 
IFEQ($(AUDIO_POLICY_TEST),TRUE)
  LOCAL_CFLAGS + =-DAUDIO_POLICY_TEST 
ENDIF 
包括$(BUILD_STATIC_LIBRARY)模塊二編譯成靜態庫
包括$(CLEAR_VARS)模塊三
LOCAL_SRC_FILES:= \ 
    AudioFlinger.cpp \ 
    AudioMixer.cpp.arm \ 
    AudioResampler.cpp.arm \ 
    AudioResamplerSinc.cpp.arm \ 
    AudioResamplerCubic.cpp.arm \ 
    AudioPolicyService.cpp 
LOCAL_SHARED_LIBRARIES:= \ 
    libcutils \ 
    libutils \ 
    libbinder \ 
    libmedia \ 
    libhardware_legacy 
IFEQ($(條$(BOARD_USES_GENERIC_AUDIO)),TRUE)
  LOCAL_STATIC_LIBRARIES + = libaudiointerface libaudiopolicybase 
  LOCAL_CFLAGS + =-DGENERIC_AUDIO 
否則
  LOCAL_SHARED_LIBRARIES + = libaudio libaudiopolicy 
ENDIF 
IFEQ($ (TARGET_SIMULATOR),TRUE)
 LOCAL_LDLIBS + =-LDL 
否則
 LOCAL_SHARED_LIBRARIES + = libdl 
ENDIF 
LOCAL_MODULE:= libaudioflinger 
IFEQ($(BOARD_HAVE_BLUETOOTH),TRUE)
  LOCAL_CFLAGS + =-DWITH_BLUETOOTH-DWITH_A2DP 
  LOCAL_SHARED_LIBRARIES + = liba2dp 
ENDIF 
IFEQ($(AUDIO_POLICY_TEST),真)
  LOCAL_CFLAGS + =-DAUDIO_POLICY_TEST 
ENDIF 
IFEQ($(TARGET_SIMULATOR),TRUE)
    IFEQ($(HOST_OS),LINUX)
        LOCAL_LDLIBS + =-LRT-lpthread的
    ENDIF 
ENDIF 
IFEQ($(BOARD_USE_LVMX),TRUE)
    LOCAL_CFLAGS + =-DLVMX 
    LOCAL_C_INCLUDES + =供應商/ NXP 
    LOCAL_STATIC_LIBRARIES + = liblifevibes 
    LOCAL_SHARED_LIBRARIES + = liblvmxservice 
#LOCAL_SHARED_LIBRARIES + = liblvmxipc 
ENDIF 
包括$(BUILD_SHARED_LIBRARY)模塊三編譯成動態庫

 

(4)編譯一個應用程序(APK)

LOCAL_PATH:= $(叫我- DIR)

include $(CLEAR_VARS)   #生成的所有java文件中的java子目錄- > 直譯(建立在java的子目錄中的所有的Java文件

LOCAL_SRC_FILES:= $(調用所有子目錄-java的文件)  #名稱的APK的建立- > 直譯(創建APK的名稱)

LOCAL_PACKAGE_NAME:= LocalPackage   #告訴它來建立一個APK - > 直譯(告訴它來建立一個APK

include $(BUILD_PACKAGE)


(5)編譯一個依賴於靜態Java庫(static.jar)的應用程序

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS)   # List of static libraries to include in the package

LOCAL_STATIC_JAVA_LIBRARIES := static-library   # Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files)   # Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage   # Tell it to build an APK

include $(BUILD_PACKAGE)
   
(6)編譯一個需要用平台的key簽名的應用程序

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)   # Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java- files)   # Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := platform   # Tell it to build an APK

include $(BUILD_PACKAGE)
   
(7)編譯一個需要用特定key前面的應用程序

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS)   # Build all java files in the java subdirectory

LOCAL_SRC_FILES := $(call all-subdir-java-files )   # Name of the APK to build

LOCAL_PACKAGE_NAME := LocalPackage

LOCAL_CERTIFICATE := vendor/example/certs/app   # Tell it to build an APK

include $(BUILD_PACKAGE)
   
(8)添加一個預編譯應用程序

LOCAL_PATH:= $(叫我- DIR)

include $(CLEAR_VARS)   #模塊的名稱應與apk文件名 ​​進行安裝。

LOCAL_MODULE:= LocalModuleName

LOCAL_SRC_FILES:= $(LOCAL_MODULE)的apk。

LOCAL_MODULE_CLASS: = APPS

LOCAL_MODULE_SUFFIX:= $(COMMON_ANDROID_PACKAGE_SUFFIX)

include $(BUILD_PREBUILT)
   
(9)添加一個靜態JAVA庫

LOCAL_PATH:= $(叫我- DIR)

include $(CLEAR_VARS)  在java子目錄#生成的所有java文件

LOCAL_SRC_FILES:= $(調用所有子目錄-java的文件)  #任何庫這個庫依賴於

LOCAL_JAVA_LIBRARIES:= android.test.runner   #創建的jar文件的名稱

LOCAL_MODULE:=樣品  。#建立一個靜態的jar文件

include $(BUILD_STATIC_JAVA_LIBRARY)

   
(10)Android.mk的編譯模塊中間可以定義相關的編譯內容,也就是指定相關的變量如下:

LOCAL_AAPT_FLAGS

LOCAL_ACP_UNAVAILABLE 

LOCAL_ADDITIONAL_JAVA_DIR LOCAL_AIDL_INCLUDES  

LOCAL_ALLOW_UNDEFINED_SYMBOLS 

LOCAL_ARM_MODE 

LOCAL_ASFLAGS 

LOCAL_ASSET_DIR 

LOCAL_ASSET_FILES

在Android.mk文件中編譯應用程序(BUILD_PACKAGE)時設置此變量,表示資源文件,通常會定義成

LOCAL_ASSET_FILES += $(call find-subdir-assets) LOCAL_BUILT_MODULE_STEM

LOCAL_C_INCLUDES額外的C/C++編譯頭文件路徑,用LOCAL_PATH表示本文件所在目錄

舉例如下:

LOCAL_C_INCLUDES += extlibs/zlib-1.2.3

LOCAL_C_INCLUDES += $(LOCAL_PATH)/src LOCAL_CC指定C編譯器

LOCAL_CERTIFICATE簽名認證

LOCAL_CFLAGS為C/C++編譯器定義額外的標誌(如宏定義),舉例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 LOCAL_CLASSPATH

LOCAL_COMPRESS_MODULE_SYMBOLS

LOCAL_COPY_HEADERS install應用程序時需要復制的頭文件,必須同時定義LOCAL_COPY_HEADERS_TO LOCAL_COPY_HEADERS_TO install應用程序時復制頭文件的目的路徑

LOCAL_CPP_EXTENSION如果你的C++文件不是以cpp為文件後綴,你可以通過LOCAL_CPP_EXTENSION指定C++文件後綴名

如:LOCAL_CPP_EXTENSION := .cc
注意統一模塊中C++文件後綴必須保持一致。

LOCAL_CPPFLAGS 傳遞額外的標誌給C++編譯器,如:LOCAL_CPPFLAGS += -ffriend-injection

LOCAL_CXX指定的C + +編譯器LOCAL_DX_FLAGS

LOCAL_EXPORT_PACKAGE_RESOURCES

LOCAL_FORCE_STATIC_EXECUTABLE

如果編譯的可執行程序要進行靜態鏈接(執行時不依賴於任何動態庫),則設置LOCAL_FORCE_STATIC_EXECUTABLE:=true 
目前只有libc有靜態庫形式,這個只有文件系統中/sbin目錄下的應用程序會用到,這個目錄下的應用程序在運行時通常
文件系統的其它部分還沒有加載,所以必須進行靜態鏈接。LOCAL_GENERATED_SOURCES LOCAL_INSTRUMENTATION_FOR

LOCAL_INSTRUMENTATION_FOR_PACKAGE_NAME

LOCAL_INTERMEDIATE_SOURCES

LOCAL_INTERMEDIATE_TARGETS

LOCAL_IS_HOST_MODULE

LOCAL_JAR_MANIFEST

LOCAL_JARJAR_RULES

LOCAL_JAVA_LIBRARIES編譯java應用程序和庫的時候指定包含的java類庫,目前有core和framework兩種
多數情況下定義成:LOCAL_JAVA_LIBRARIES := core framework
注意LOCAL_JAVA_LIBRARIES不是必須的,而且編譯APK時不允許定義(系統會自動添加) LOCAL_JAVA_RESOURCE_DIRS 

LOCAL_JAVA_RESOURCE_FILES 

LOCAL_JNI_SHARED_LIBRARIES 

LOCAL_LDFLAGS傳遞額外的參數給連接器(務必注意參數的順序) LOCAL_LDLIBS為可執行程序或者庫的編譯指定額外的庫,指定庫以"-lxxx"格式,

舉例:

LOCAL_LDLIBS += -lcurses -lpthread

LOCAL_LDLIBS += -Wl,-z,origin LOCAL_MODULE生成的模塊的名稱(注意應用程序名稱用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)

LOCAL_MODULE_PATH生成模塊的路徑LOCAL_MODULE_STEM LOCAL_MODULE_TAGS生成模塊的標記LOCAL_NO_DEFAULT_COMPILER_FLAGS

LOCAL_NO_EMMA_COMPILE

LOCAL_NO_EMMA_INSTRUMENT

LOCAL_NO_STANDARD_LIBRARIES

LOCAL_OVERRIDES_PACKAGES

LOCAL_PACKAGE_NAME APK應用程序的名稱

LOCAL_POST_PROCESS_COMMAND LOCAL_PREBUILT_EXECUTABLES預編譯,包括$(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時所用,指定需要複製的可執行文件

LOCAL_PREBUILT_JAVA_LIBRARIES

LOCAL_PREBUILT_LIBS 預編譯including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)時所用, 指定需要復制的庫

LOCAL_PREBUILT_OBJ_FILES

LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES  LOCAL_PRELINK_MODULE是否需要預連接處理(默認需要,用來做動態庫優化)

LOCAL_REQUIRED_MODULES指定模塊運行所依賴的模塊(模塊安裝時將會同步安裝它所依賴的模塊) LOCAL_RESOURCE_DIR

LOCAL_SDK_VERSION

LOCAL_SHARED_LIBRARIES可鏈接動態庫

LOCAL_SRC_FILES編譯源文件

LOCAL_STATIC_JAVA_LIBRARIES

LOCAL_STATIC_LIBRARIES可鏈接靜態庫

LOCAL_UNINSTALLABLE_MODULE

LOCAL_UNSTRIPPED_PATH LOCAL_WHOLE_STATIC_LIBRARIES指定模塊所需要載入的完整靜態庫(這些精通庫在鏈接是不允許鏈接器刪除其中無用的代碼)

LOCAL_YACCFLAGS OVERRIDE_BUILT_MODULE_PATH

 

變數說明
LOCAL_MODULE:編譯的目標
LOCAL_SRC_FILES:編譯的文件
LOCAL_PRELINK_MODULE:是否需要 Prelink 處理
LOCAL_PATH:編譯的目錄,$(call 目錄,目錄….) 
如該目錄下有文件夾名稱 src,則可以寫 $(call src),這樣就會得到 src 的完整路路徑。
CLEAR_VARS:清除之前的一些系统变量,CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
LOCAL_C_INCLUDES:需要包含的文件目錄,也可以是相對路徑。
如該編譯目錄下有個 include 目錄,寫法是 include/*.h
LOCAL_CFLAGS += -O3 -fstrict-aliasing:設定編譯參數
LOCAL_JAVA_LIBRARIES:加入 jar
LOCAL_PACKAGE_NAME:Java AP 的名字要用此變數定義
LOCAL_STATIC_LIBRARIES:Link 時需要的外部靜態LIB
LOCAL_SHARED_LIBRARIES:Link 時需要的外部動態LIB
BUILD_SHARED_LIBRARY:指定要編譯成動態LIB
BUILD_STATIC_LIBRARY:指定要編譯成靜態LIB
BUILD_EXECUTABLE:指定要編譯成執行檔
BUILD_STATIC_JAVA_LIBRARY:指定要編譯成靜態 JAVA LIB
LOCAL_ALLOW_UNDEFINED_SYMBOLS:default false,但有未定義的函數會出現 "undefined symbol" error,可以設為"true"避過該錯誤訊息。

 

REF://http://www.cnblogs.com/hesiming/archive/2011/03/15/1984444.html

 

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()