Android.mk解析


Android.mk文件用來向編譯系統描述如何編譯你的源代碼。在編譯整個工程的情況下,系統所找到的所有的Android.mk將會先存入subdir_makefiles變量中,隨后一次性一次性include進整個編譯文件中。

(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的定義在build/core/clear_vars.mk中,它清除了上百個除LOCAL_PATH外的變量,因而LOCAL_PATH通常被認為是一個編譯模塊的開始標志。
②include $(BUILD_XXX)
這個是Android.mk的重點,它表示將源碼編譯成什么目標文件,如動態庫、可執行程序、APK等,它一般被認為是一個編譯模塊的結束標志。
(3)編譯一個應用程序(APK)
  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
  # Tell it to build an APK
  include $(BUILD_PACKAGE)

(4)編譯一個依賴於靜態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)

(5)編譯一個需要用平台的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)

(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 := vendor/example/certs/app   
 # Tell it to build an APK
 include $(BUILD_PACKAGE)

(7)添加一個預編譯應用程序

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)
  # Module name should match apk name to be installed.
  LOCAL_MODULE := LocalModuleName
  LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
  LOCAL_MODULE_CLASS := APPS
  LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
  include $(BUILD_PREBUILT)

(8)添加一個靜態JAVA庫

  LOCAL_PATH := $(call my-dir)
  include $(CLEAR_VARS)   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)   
  # Any libraries that this library depends on
  LOCAL_JAVA_LIBRARIES := android.test.runner   
  # The name of the jar file to create
  LOCAL_MODULE := sample
  # Build a static jar file.
  include $(BUILD_STATIC_JAVA_LIBRARY)

(9)編譯生成可執行文件

 

LOCAL_PATH:= $(call my-dir)  
  
include $(CLEAR_VARS)  
  
LOCAL_MODULE_TAGS := optional  
  
LOCAL_C_INCLUDES += \  
     $(LOCAL_PATH)  
       
LOCAL_SRC_FILES:= \  
        gpio-server.c  
  
LOCAL_SHARED_LIBRARIES := \  
    libcurl \  
    libcutils  
  
LOCAL_MODULE:= gpio-server  
  
include $(BUILD_EXECUTABLE)  
  
include $(call all-makefiles-under,$(LOCAL_PATH))

 

(10)編譯生成動態庫

 

LOCAL_PATH:= $(call my-dir)  
include $(CLEAR_VARS)  
  
LOCAL_SRC_FILES:= \  
    com_android_server_AlarmManagerService.cpp \  
    com_android_server_BatteryService.cpp \  
    com_android_server_InputApplicationHandle.cpp \  
    com_android_server_InputManager.cpp \  
    com_android_server_InputWindowHandle.cpp \  
    com_android_server_LightsService.cpp \  
    com_android_server_PowerManagerService.cpp \  
    com_android_server_SystemServer.cpp \  
    com_android_server_UsbDeviceManager.cpp \  
    com_android_server_UsbHostManager.cpp \  
    com_android_server_VibratorService.cpp \  
    com_android_server_location_GpsLocationProvider.cpp \  
    com_android_server_connectivity_Vpn.cpp \  
    com_android_server_ConnectivityService.cpp \  
    onload.cpp  
  
LOCAL_C_INCLUDES += \  
    $(JNI_H_INCLUDE) \  
    frameworks/base/services \  
    frameworks/base/core/jni \  
    external/skia/include/core  
  
LOCAL_SHARED_LIBRARIES := \  
    libandroid_runtime \  
    libcutils \  
    libhardware \  
    libhardware_legacy \  
    libnativehelper \  
    libsystem_server \  
    libutils \  
    libui \  
    libinput \  
    libskia \  
    libgui \  
    libusbhost  
  
ifeq ($(WITH_MALLOC_LEAK_CHECK),true)  
    LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK  
endif  
  
LOCAL_MODULE:= libandroid_servers  
  
include $(BUILD_SHARED_LIBRARY) 

 

(11)通過Android.mk添加一個編譯模塊到系統中的順序如下

①LOCAL_PATH
②CLEAR_VARS
③LOCAL_SRC_FILES
④LOCAL_CFLAGS(可選)
⑤LOCAL_MODULE
⑥LOCAL_STATIC_LIBRARIES(可選)
⑦BUILD_XXX
 
(12)Android.mk常用的變量
變量名 說明
LOCAL_PATH 用於確定源碼所在的目錄,最好把它放在CLEAR_VARS變量引用的前面,因為它不會被清除,每個Android.mk只需要定義
一次即可。
CLEAR_VARS 它清空了很多以LOCAL_開頭的變量(LOCAL_PATH除外)。由於所有的MakeFile都是在一個編譯環境下執行的,因此
變量的定義理論上是全局的,在每個模塊編譯開始前進行清理工作是必要的。
LOCAL_MODULE 模塊名,需保證在整個編譯系統中是唯一存在的,而且中間不可以有空格
LOCAL_MODULE_PATH 模塊的輸出路徑
LOCAL_SRC_FILES 模塊編譯過程中涉及到的源文件。如果是JAVA程序,可以考慮調用all-subdir-java-files來一次性添加目錄(包括子目錄)下所有的java文件
因為有LOCAL_PATH,這里只需要給出文件名(相對路徑)即可;而且編譯系統有比較強的推導功能,可以自動計算依賴關系。
LOCAL_CC 用於指定C編譯器
LOCAL_CXX 用於指定C++編譯器
LOCAL_CPP_EXTENSION 用於指定特殊的C++文件后綴名
LOCAL_CFLAGS C語言編譯時的額外選項
LOCAL_CXXFLAGS C++語言編譯時的額外選項
LOCAL_C_INCLUDE 編譯C和C++程序所需要的額外頭文件
LOCAL_STATIC_LIBRARIES 編譯所需的靜態庫列表
LOCAL_SHARED_LIBRARIES 編譯時所需要的動態庫列表
LOCAL_JAVA_LIBRARIES 編譯時所需要的JAVA類庫
LOCAL_LDLIBS 編譯時所需要的鏈接選項
LOCAL_COPY_HEADERS 安裝應用程序時所需要復制的頭文件列表,需要和LOCAL_COPY_HEARERS_TO變量配合使用
LOCAL_MODULE_CLASS 標識所編譯模塊最后放置的位置。ETC表示放置在/system/etc.目錄下,APPS表示放置在/system/app目錄下,SHARED_LIBRARIES表示放置在/system/lib目錄下。如果具體指定,則編譯的模塊不會放到編譯系統中,最后會在out對應product的obj目錄下的對應目錄中。
LOCAL_MODULE_TAGS 當前模塊所包含的標簽,一個模塊可以包含多個標簽。標簽的值可能是eng、user、debug、development、optional。其中,optional是默認標簽。
LOCAL_DEX_PREOPT apk的odex優化開關,默認是false
$(call my-dir) 獲取當前文件夾的路徑
$(call all-java-files-under,<src>) 獲取指定目錄下的所有java文件
$(call all-c-files-under, <src>) 獲取指定目錄下的所有c文件
$(call all-Iaidl-files-under, <src>) 獲取指定目錄下的所有AIDL文件
$(call all-makefiles-under, <folder>) 獲取指定目錄下的所有Make文件
$(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>) 獲取Build輸入的目標文件夾路徑
BUILD_HOST_STATIC_LIBRARY
BUILD_HOST_SHARED_LIBRARY
BUILD_STATIC_LIBRARY
BUILD_RAW_STATIC-LIBRARY
BUILD_SHARED_LIBRARY
BUILD_EXECUTABLE
BUILD_RAW_EXECUTABLE
BUILD_HOST_EXECUTABLE
BUILD_PACKAGE
BUILD_HOST_PREBUILT
BUILD_PREBUILT
BUILD_MULTI_PREBUILT
BUILD_JAVA_LIBRARY
BUILD_STATIC_JAVA_LIBRARY
BUILD_HOST_JAVA_LIBRARY
BUILD_DROIDDOC
BUILD_COPY_HEADERS
BUILD_KEY_CHAR_MAP
各種形式的編譯模板,如靜態、動態庫文件,可執行文件,文檔等

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM