Android.mk簡單分析

來源:互聯網
上載者:User

標籤:

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := SettingsLOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE)# Use the folloing include to make our test apk.include $(call all-makefiles-under,$(LOCAL_PATH))

該Android.mk檔案路徑是package/app/Settings/Android.mk,來分析該檔案

GNU Make‘功能’宏,必須通過使用‘$(call  )‘來調用,調用他們將返迴文本化的資訊。

------------------------------------------------------------------------------------------------------------------------------

(1) LOCAL_PATH:= $(call my-dir)

一個Android.mk file首先必須定義好LOCAL_PATH變數。它用於在開發樹中尋找源檔案。

宏函數’my-dir’,由編譯系統提供,用於返回當前路徑(即包含Android.mk file檔案的目錄)。

------------------------------------------------------------------------------------------------------------------------------

(2) Android.mk中可以定義多個編譯模組,每個編譯模組都是以include $(CLEAR_VARS)開始,以include $(BUILD_XXX)結束。

(2.1) include $(CLEAR_VARS)

CLEAR_VARS指的是clear_vars.mk,由編譯系統提供,它會讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變數,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。

這是必要的,因為所有的編譯控制檔案都在同一個GNU MAKE執行環境中,所有的變數都是全域的。

 

(2.2) include $(BUILD_PACKAGE)      # Tell it to build an APK

$(BUILD_PACKAGE)是用來編譯產生package/app/下的apk。

還有其他幾種編譯情況:

include $(BUILD_STATIC_LIBRARY)   表示編譯成靜態庫

include $(BUILD_SHARED_LIBRARY)  表示編譯成動態庫

include $(BUILD_EXECUTABLE)      表示編譯成可執行程式         

至於例子的話,跳轉到下面的"擴充"

------------------------------------------------------------------------------------------------------------------------------

(3) LOCAL_MODULE_TAGS := optional

解析:

LOCAL_MODULE_TAGS :=user eng tests optional

user:  指該模組只在user版本下才編譯

eng:  指該模組只在eng版本下才編譯

tests: 指該模組只在tests版本下才編譯

optional:指該模組在所有版本下都編譯

取值範圍debug eng tests optional samples shell_ash shell_mksh。注意不能取值user,如果要預裝,則應定義core.mk。

------------------------------------------------------------------------------------------------------------------------------

(4) LOCAL_SRC_FILES := $(call all-java-files-under, src)

(4.1) 如果要包含的是java源碼的話,可以調用all-java-files-under得到。(這種形式來包含local_path目錄下的所有java檔案)

(4.2) 當涉及到C/C++時,LOCAL_SRC_FILES變數就必須包含將要編譯打包進模組中的C或C++原始碼檔案。注意,在這裡你可以不用列出標頭檔和包含檔案,因為編譯系統將會自動為你找出依賴型的檔案;僅僅列出直接傳遞給編譯器的原始碼檔案就好。

all-java-files-under宏的定義是在build/core/definitions.mk中。

------------------------------------------------------------------------------------------------------------------------------

(5) LOCAL_PACKAGE_NAME := Settings

package的名字,這個名字在指令碼中將標識這個app或package。

------------------------------------------------------------------------------------------------------------------------------

(6) LOCAL_CERTIFICATE := platform

LOCAL_CERTIFICATE 後面是簽名檔案的檔案名稱,說明Settings.apk是一個需要platform key簽名的APK

------------------------------------------------------------------------------------------------------------------------------

(7) include $(BUILD_PACKAGE)

在(2.2)中已作解釋

------------------------------------------------------------------------------------------------------------------------------

(8) include $(call all-makefiles-under,$(LOCAL_PATH))

載入目前的目錄下的所有makefile檔案,all-makefiles-under會返回一個位於當前‘my-dir‘路徑的子目錄中的所有Android.mk的列表。

all-makefiles-under宏的定義是在build/core/definitions.mk中。

------------------------------------------------------------------------------------------------------------------------------

 

這個Android.mk檔案最後就產生了Settings.apk。分析完上面的Android.mk檔案後,來總結下各種LOCAL_XXX。

三種情況說明:

    必須定義, 在app或package的Android.mk中必須給定值。

    可選定義,在app或package的Android.mk中可以也可以不給定值。

    不用定義,在app或package的Android.mk中不要給定值,指令碼自動指定值。

 

LOCAL_PATH,          當前路徑,必須定義。LOCAL_PACKAGE_NAME,  必須定義,package的名字,這個名字在指令碼中將標識app或package。LOCAL_MODULE_SUFFIX, 不用定義,module的尾碼,=.apk。LOCAL_MODULE,        不用定義,=$(LOCAL_PACKAGE_NAME)。LOCAL_JAVA_RESOURCE_DIRS,     不用定義。LOCAL_JAVA_RESOURCE_FILES,    不用定義。LOCAL_MODULE_CLASS,  不用定義。LOCAL_MODULE_TAGS,   可選定義。預設optional。取值範圍user debug eng tests optional samples shell_ash shell_mksh。LOCAL_ASSET_DIR,     可選定義,推薦不定義。預設$(LOCAL_PATH)/assetsLOCAL_RESOURCE_DIR,  可選定義,推薦不定義。預設product package和device package相應的res路徑和$(LOCAL_PATH)/res。LOCAL_PROGUARD_ENABLED,       可選定義,預設為full,如果是user或userdebug。取值full, disabled, custom。full_android_manifest,        不用定義,=$(LOCAL_PATH)/AndroidManifest.xml。LOCAL_EXPORT_PACKAGE_RESOURCES,    可選定義,預設null。如果允許app的資源被其它模組使用,則設定true。LOCAL_CERTIFICATE,   可選定義,預設為testkey。最終        private_key := $(LOCAL_CERTIFICATE).pk8        certificate := $(LOCAL_CERTIFICATE).x509.pem

 

 

擴充:在一個Android.mk中可以產生多個可執行程式、動態庫和靜態庫。

(1)編譯APK應用程式模板。關於編譯APK應用程式的模板請參照《Android.mk編譯APK範例》  (2)編譯JAVA庫模板
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)# Any libraries that this library depends onLOCAL_JAVA_LIBRARIES := android.test.runner# The name of the jar file to createLOCAL_MODULE := sample# Build a static jar file.include $(BUILD_STATIC_JAVA_LIBRARY)
   :LOCAL_JAVA_LIBRARIES := android.test.runner表示產生的JAVA庫的jar檔案名稱  (3)編譯C/C++應用程式模板如下
LOCAL_PATH := $(call my-dir)#include $(CLEAR_VARS)LOCAL_SRC_FILES := main.cLOCAL_MODULE := test_exe#LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :=#LOCAL_SHARED_LIBRARIES :=include $(BUILD_EXECUTABLE)

 :‘:=’是賦值的意思,‘+=‘是追加的意思,‘$’表示引用某變數的值

LOCAL_SRC_FILES中加入源檔案路徑,LOCAL_C_INCLUDES中加入需要的標頭檔搜尋路徑LOCAL_STATIC_LIBRARIES 加入所需要連結的靜態庫(*.a)的名稱,LOCAL_SHARED_LIBRARIES 中加入所需要連結的動態庫(*.so)的名稱,LOCAL_MODULE表示模組最終的名稱,BUILD_EXECUTABLE 表示以一個可執行程式的方式進行編譯。

 

(4)編譯C\C++靜態庫
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES :=  helloworld.cLOCAL_MODULE:= libtest_static #LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :=#LOCAL_SHARED_LIBRARIES :=include $(BUILD_STATIC_LIBRARY)

 和上面相似,BUILD_STATIC_LIBRARY 表示編譯一個靜態庫。

(5)編譯C/C++動態庫的模板
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES := helloworld.cLOCAL_MODULE := libtest_sharedTARGET_PRELINK_MODULES := false#LOCAL_C_INCLUDES :=#LOCAL_STATIC_LIBRARIES :=#LOCAL_SHARED_LIBRARIES :=include $(BUILD_SHARED_LIBRARY)

和上面相似,BUILD_SHARED_LIBRARY 表示編譯一個共用庫。

以上三者的產生結果分別在如下目錄中,generic 依具體 target 會變(可能是dkb~~):
out/target/product/generic/obj/APPSout/target/product/generic/obj/JAVA_LIBRARIESout/target/product/generic/obj/EXECUTABLEout/target/product/generic/obj/STATIC_LIBRARYout/target/product/generic/obj/SHARED_LIBRARY

每個模組的目標檔案夾分別為:

1)APK程式:XXX_intermediates2)JAVA庫程式:XXX_intermediates3)C\C++可執行程式:XXX_intermediates4)C\C++靜態庫: XXX_static_intermediates5)C\C++動態庫: XXX_shared_intermediates

 

 

 

 

參考文章: 

講解的很詳細~~

Android.mk簡介

編譯apk的例子~~

Android.mk編譯APK範例

這個講的有點廣,涉及到很多mk檔案~~

Android makefile 組織圖

 

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.