Android.mk文件语法规范
序言:
-------------
此文檔旨在描述Android.mk文件的語法,Android.mk文件為Android NDK(原生開發(fā))描述了你C/C++源文件。
為了明白下面的內(nèi)容,你必須已經(jīng)閱讀了docs/OVERVIEW.TXT的內(nèi)容,它解釋了Android.mk文件扮演的角色
和用途。
概述:
---------
寫一個Android.mk文件是為了向生成系統(tǒng)描述你的源代碼。更明確的說:
- 這個文件實(shí)際上是GNU Make文件的一小片段,它會被生成系統(tǒng)解析一次或多次。
因此,你應(yīng)該在Android.mk里盡量少地聲明變量,而不要誤以為在解析的過程中
沒有任何東西被定義。
- 該文件的語法的明的人為了讓你能將你的源代碼組織為組件(module).一個組件指的是下面的一項(xiàng):
???? - 一個靜態(tài)庫(static library)
???? - 一個共享庫(shared library)
???
只有一個動態(tài)庫會被安裝/拷貝至你的application package中。但是靜態(tài)庫可用來
生成動態(tài)庫。
你可以在每個Android.mk文件定義一個或多個組件,并且我可以在幾個組件中使用
相同的源文件。
- 生成系統(tǒng)為你處理了一些瑣碎之事。比如,在你的Android.mk里,你不須要列出頭文件或
列出生成的文件之間的明確認(rèn)依賴關(guān)系。NDK生成系統(tǒng)會為你自動生成。
這也意味著,當(dāng)更新至新的NDK版本時,你能得到新的工具鏈/平臺支持(toolchain/platform support)
的好處,而無須修改你的android.mk文件。
需要注意的是,此語法與完全開源的Android平臺的Android.mk文件的語法非常相似,但使用它們的
生成系統(tǒng)的實(shí)現(xiàn)不同,這個為了讓開發(fā)者能更容易的復(fù)用“外部”庫的源代碼。
簡單例子:
---------------
?
在詳細(xì)描述語法之前,讓我們探究一個簡單的“hello JNI”例子,它的文件位于:
??? apps/hello-jni/projec
這里,我們能看到:
- 放有Java源文件的src文件夾。
- 放有本地源文件,即jni/hello-jni.c的jni文件夾。
??? 這個源文件實(shí)現(xiàn)一個簡單的共享庫。這個共享庫有一個本地方法(native method),它將一個字符串
??? 返回給虛擬機(jī)應(yīng)用(著:即Java層應(yīng)用程序)
- jni/Anroid.mk文件為NDK生成系統(tǒng)描述了這個共享庫。它的內(nèi)容為:
?? ---------- cut here ------------------
?? LOCAL_PATH := $(call my-dir)
?? include $(CLEAR_VARS)
?? LOCAL_MODULE??? := hello-jni
?? LOCAL_SRC_FILES := hello-jni.c
?? include $(BUILD_SHARED_LIBRARY)
?? ---------- cut here ------------------
現(xiàn)在,讓我們逐行解釋:
LOCAL_PATH := $(call my-dir)
每個Android.mk文件都必須以定義LOCAL_PATH變量開始。其目的是為了定位源文件的位置。在這個例子,
生成系統(tǒng)提供的宏函數(shù)(macro function)‘my-dir'用來返回當(dāng)前路徑(即放有Android.mk文件的文件夾)
include $(CLEAR_VARS)
CLEAR_VARS變量是生成系統(tǒng)提供的,它指向一個特殊的GNU Makefile.這個Makefile將會為你自動清除
許多名為LOCAL_XXX的變量(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),
但LOCAL_PATH是例外,它不會被清除。這些變量的清除是必須的,因?yàn)樗械目刂莆募窃趩我坏腉NU make
執(zhí)行環(huán)境中解析的,在這里所有的變量都是全局的。
LOCAL_MODULE := hello-jni
為了在你的Android.mk文件標(biāo)識每個組件,必須定義LOCAL_MODULE變量。這個名字必須要唯一的并且不能
包含空格。注意:生成系統(tǒng)會自動地為相應(yīng)生成的文件加入前綴或后綴。換言之,一個名叫foo的共享庫組件
會生成'libfoo.so'.
重要注意事項(xiàng):
如果你把組件取名為‘libfoo',生成系統(tǒng)將不會加上‘lib'前綴,還是
生成libfoo.so。這是為了支持源于Android平臺源代碼的Android.mk文件。
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SRC_FILES變量必須包含一系列將被構(gòu)建和組合成組件的C/C++源文件。注意:你
不需要列出頭文件或include文件,因?yàn)樯上到y(tǒng)會為你自動計算出源文件的依賴關(guān)系。
僅僅列出那些將直接傳給編譯器的源文件足矣。
注意,默認(rèn)的C++源文件的擴(kuò)展名是‘.cpp'。但你可以通過定義LOCAL_DEFAULT_EXTENSION
來指定一個擴(kuò)展名。別忘了擴(kuò)展名開始的那一點(diǎn)(比如,‘.cxx’,能行,但‘cxx'不行)。
include $(BUILD_SHARED_LIBRARY)
生成系統(tǒng)提供的BUIL_SHARED_LIBRARY變量指向一個GNU Makefile腳本,這個腳本主管
收集在最近的一次#include $(CLEAR_VARS)(著:即清除'本地'變量)之后你所定義的
LOCAL_XXX變量的信息,并決定生成什么,如何準(zhǔn)確的生成。BUILD_STATIC_LIBRARY可
生成一個靜態(tài)庫。
There are more complex examples under apps/, with commented
Android.mk files that you can look at.
在apps文件下有一些復(fù)雜點(diǎn)的例子,它帶有注釋的Android.mk文件以供你學(xué)習(xí)。
?
參考:
-----------
以下列出你在Android.mk里應(yīng)該依賴或定義的變量。你能定義其它變量,但下列的變量名是
由NDK生成系統(tǒng)保留的。
- 以LOCAL_ 開頭的變量名 (比如,LOCAL_MODULE)
- 以PRIVATE_ ,NDK_ 或 APP_ (內(nèi)部使用)開頭的量名
_ 小寫字母變量名(內(nèi)部使用,如 my-dir).
如果你需要在Android.mk里定義方便自己使用的變量名,我們建議使用MY_ 前綴,
如下面一個簡單例子:
?? ---------- cut here ------------------
??? MY_SOURCES := foo.c
??? ifneq ($(MY_CONFIG_BAR),)
????? MY_SOURCES += bar.c
??? endif
??? LOCAL_SRC_FILES += $(MY_SOURCES)
?? ---------- cut here ------------------
??
So, here we go:
NDK提供的變量:
- - - - - - - - - - - - - -
下列的這些GNU Make變量是在你的Android.mk被解析之前,就被生成系統(tǒng)事先定義
的了.注意,在某些情況下,NDK可能會多次解析你的Android.mk,每次對其中一些變量的
定義不同。
CLEAR_VARS
??? 指向一個生成腳本,這個腳本取消幾乎所有LOCAL_XXX變量的定義(譯者注:除了LOCAL_PATH)。
??? 在開始描述一個新的組件之前,你必須include這個腳本,e.g.:
????
????? include $(CLEAR_VARS)
????
????
BUILD_SHARED_LIBRARY
?? 指向一個生成腳本,這個腳本通過LOCAL_XXX變量收集關(guān)于組件的信息,并決定如何
?? 根據(jù)你列出來的源文件生成目標(biāo)分享庫。注意,在include這個腳本文件之前你必須
?? 至少已經(jīng)定義了LOCAL_MODULE和LOCAL_SRC_FILES。用法舉例:
???? include $(BUILD_SHARED_LIBRARY)
?????
?? 注意,這會生成一個名為 lib$(LOCAL_MODULE).so的文件。(譯者注:$(BUILD_SHARED_MODULE)為文件名)
????
BUILD_STATIC_LIBRARY
??? 與BUILD_SHARED_LIBRARY類似,但用來生成目標(biāo)靜態(tài)庫。靜態(tài)庫不會被拷貝至你的
??? project/packages文件夾下,但可用來生成分享庫(參考 LOCAL_STATIC_LIBRARIES
??? 和LOCAL_STATIC_WHOLE_LIBRARIES,將在后面描述)
??? 用法示例:
??? ?? include $(BUILD_STATIC_LIBRARY)
??? 注意,這會生成一個方件名叫l(wèi)ib$(LOCAL_MODULE).a
???
TARGET_ARCH
?? 目標(biāo)CPU的名字,在完整的Android開源代碼的生成中指定。對于基于ARM兼容的CPU,
?? 它被指定為'arm',與CPU架構(gòu)的修訂無關(guān)。
????
???
TARGET_PLATFORM
?? 當(dāng)解析該Android.mk文件時用它來指定Andoid目標(biāo)平臺的名稱。譬如,'android-3'與
?? Android 1.5系統(tǒng)鏡像相對應(yīng)。若要了解所有的平臺名稱及其相應(yīng)的Android系統(tǒng)鏡像,
?? 請閱讀docs/STABLE-APIS.TXT
????
TARGET_ARCH_ABI
??? 當(dāng)解析該Android.mk時,CPU+ABI的名稱。目前只有一個值。
??? (譯者注:ABI,Application Binary Interface,二進(jìn)制應(yīng)用程序接口)
?????? armeabi??? For Armv5TE
???????
?????? armeabi??? 指定Armv5TE
??????????
??? 注意:到NDK 1.6_r1為止,僅簡單的定義這個變量為'arm'。但為了更好地配合
??? Android平臺的內(nèi)部使用,該值已重定義。
????
??? 關(guān)于ABI與相應(yīng)的兼容問題更多詳情,請閱讀docs/CPU-ARCH-ABIS.TXT
??? 未來的NDK版本將會引入其它的平臺的ABI并會有不同的名稱。注意,所有基于ARM的ABI會
??? 使TARGET_ARCH定義為'arm',但可能擁有不同的TARGET_ARCH_ABI
???
????
TARGET_ABI???
??? 目標(biāo)平臺與abi的連接,它實(shí)際上被定義為 $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),
??? 當(dāng)你想在一個真實(shí)的裝置上測試特定的目標(biāo)系統(tǒng)鏡像時,它就很有用了。
????
??? 默認(rèn)下,它的值為'android-3-armeabi'
????
??? (在Android NDK 1.6_r1及之前的版本,它的默認(rèn)值為'android-3-arm')
????
???
NDK提供的宏函數(shù):
----------------------------
以下是一些GNU Make的宏‘函數(shù)’,必須通過這樣的形式調(diào)用:'$(call <function>)'。
函數(shù)返回文本信息。
????????
my-dir
??? 返回放置當(dāng)前Android.mk的文件夾相對于NDK生成系統(tǒng)根目錄的路徑。可用來
??? 在Android.mk的開始處定義LOCAL_PATH的值:
????
?????? LOCAL_PATH := $(call my-dir)??????
????????
all-subdir-makefiles
????? 返回‘my-dir’子目錄下的所有Android.mk。比如,代碼的結(jié)構(gòu)如下:
???? sources/foo/Android.mk
??????? sources/foo/lib1/Android.mk
??????? sources/foo/lib2/Android.mk
????????
??? 如果sources/foo/Android.mk里有這樣一行:
????????
??????? include $(call all-subdir-makefiles)
????
??? 那么,它將會自動地includesources/foo/lib1/Android.mk和sources/foo/lib2/Android.mk
????
??? 這個函數(shù)能將深層嵌套的代碼文件夾提供給生成系統(tǒng)。注意,默認(rèn)情況下,NDK僅在
??? source/*/Android.mk里尋找文件。
????
this-makefile
???? 返回當(dāng)前Makefile(譯者注:指的應(yīng)該是GNU Makefile)的路徑(即,這個函數(shù)是在哪里調(diào)用的)
parent-makefile
???? 返回在列入樹(inclusion tree)中的父makefile的路徑。
??? 即,包含當(dāng)前makefile的那個makefile的路徑。??
grand-parent-makefile
??? 猜猜看...(譯者注:原文為Guess what...)
組件描述相關(guān)的變量:
- - - - - - - - - -
以下的變量是用來向生成系統(tǒng)描述你的組件的。你應(yīng)該在'include $(CLEAR_VARS)'
和'include $(BUILD_XXXXX)'之間定義其中的一些變量。正如在前面所說的,$(CLEAR_VARS)
是一個將會取消所有這些變量的腳本,除非在對變量的描述時有顯式的說明。
????
LOCAL_PATH
?? 這個變量用來設(shè)置當(dāng)前文件的路徑。你必須在Android.mk的開始處定義它,比如:
?????
??? LOCAL_PATH := $(call my-dir)
????
?? 這個變量不會被$(CLEAR_VARS)消除,所以每個Android.mk僅需一個定義(以防你在
?? 同一個文件里定義幾個組件)。
??
????
LOCAL_MODULE
?? 定義組件的名稱。對于所有的組件名,它必須是唯一,且不能包含空格。
?? 在include $(BUILD_XXX)之前你必須定義它。
??
?? 這個組件名決定生成的文件(譯者注:即庫名)。比如,lib<foo>,即這個組件的名稱
?? 為<foo>。但是在你的NDK生成文件(不管是Android.mk還是Application.mk)中
?? 你只能通過‘正常’的名稱(如,<foo>)來引用其它的組件。
??
??????????
LOCAL_SRC_FILES
?? 用它來定義所有用來生成組件的源文件。僅須列出傳給編譯器的文件,因?yàn)?br />?? 生成系統(tǒng)會自動地計算它們的相互依賴關(guān)系。
??
?? 注意,所有文件名都是相對于LOCAL_PATH的,你可以用到路徑組件(path component)
?? 如:
???? LOCAL_SRC_FILES := foo.c \ (譯者注:‘\’為連接符)
???????????????????????? toto/bar.c
????????
LOCAL_CPP_EXTENSION
?? 這是一個可選的變量,可用它來指明C++源文件的擴(kuò)展名。默認(rèn)情況下是'.cpp',
?? 但你可以改變它。比如:
????
???? LOCAL_CPP_EXTENSION := .cxx
??????
????
LOCAL_C_INCLUDES
?? 一個相對于相對于NDK*根*目錄可選的路徑名單,當(dāng)編譯所有的源文件(C,C++和匯編)時,
?? 它將被添加進(jìn)include搜索路徑。例如:
???
????? LOCAL_C_INCLUDES := sources/foo
??
???? 或者甚至:
?????
????? LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo
LOCAL_CFLAGS
??? 一個可選的編譯標(biāo)記集,在生成C與C++源文件時,將解析它。
????
??? 對指定額外的宏定義或編譯選項(xiàng)很有用。
???????????????
??? 重要:不要試圖改變你Android.mk里的optimization/debuggin level,通過
????????? 在你的Android.mk里指定合適的信息,它將被自動處理,并使NDK生成
????????? 調(diào)試時可用的有用的數(shù)據(jù)文件。
??????????
??? 注意:在android-ndk-1.5_r1,相應(yīng)的標(biāo)記(flags)只適用于C源文件,對C++
??? ??? 源文件并不適用。為了適用于完整的Android生成系統(tǒng)的特性,已作了修
??? ??? 正。(現(xiàn)在,你可以使用LOCAL_CPPFLAGS為C++文件指定標(biāo)記)
LOCAL_CXXFLAGS
??? LOCAL_CPPFLAGS的別名。注意,不建議使用這個變量,因?yàn)樵谖磥淼腘DK版本中,
??? 它可能會消失。
LOCAL_CPPFLAGS
???? 一個可選的編譯標(biāo)記集,*僅*在生成C++源文件時解析它。在編譯器的命令行里
???? 它將在LOCAL_CFLAGS之后出現(xiàn)。
??? 注意:在android-ndk-1.5_r1,相應(yīng)的標(biāo)記(flags)適用于C與C++源文件。
??? ??? 為了適用于完整的Android生成系統(tǒng)的特性,已作了修
??? ??? 正。(現(xiàn)在,你可以使用LOCAL_CFLAGS為C和C++源文件指定標(biāo)記)
LOCAL_STATIC_LIBRARIES
??? 一份static libraries組件的名單(以BUILD_STATIC_LIBRARY的方式生成),它將被
??? 連接到欲生成的組件上。這僅在生成shared library組件時有意義。(譯者注:將指定
??? 的一個或多個static library module轉(zhuǎn)化為一個shared library module)
LOCAL_SHARED_LIBRARIES
??? 一份該組件在運(yùn)行期依賴于它的shared libraries *組件*。在連接時間(link time)里
??? 與及為該生成的文件嵌入相應(yīng)的信息都要用到它。
??? 注意,它并不將這份組件名單添加入生成圖表(build graph)。即,在你的Android.mk
??? 里,你仍應(yīng)該將它們加入到你的應(yīng)用程序要求的組件。
LOCAL_LDLIBS
??? 一份能在生成你的組件時用到的額外的連接器標(biāo)記(linkerflags)的名單。在傳遞
??? 有“-l”前綴的特殊系統(tǒng)庫的名稱時很有用。比如,下面的語句會告訴連接器在裝載?
??? 時間(load time)里生成連接到/system/lib/libz.so的組件。
????? LOCAL_LDLIBS := -lz
??? 若想知道在這個NDK版本可以連接哪些暴露的系統(tǒng)庫(exposed system libraries),
??? 請參見docs/STABLE-APIS。
LOCAL_ALLOW_UNDEFINED_SYMBOLS
??? 缺省值情況下,當(dāng)嘗試生成一個shared library遇到?jīng)]有定義的引用時,會導(dǎo)致“undefined?
??? symbol”error。這對在你的源代碼里捕捉bugs有很大的幫助。
????
??? 但是,因?yàn)橐恍┰蚰沩氁猟isable這個檢查,將這個變量設(shè)置為'true’。注意,相應(yīng)
??? 的shared library可能在運(yùn)行期裝載失敗。
LOCAL_ARM_MODE
??? 缺省值情況下,ARM目標(biāo)二進(jìn)制將會以‘thumb’模式生成,這時每個指令都是16-bit寬的。
??? 如果你想強(qiáng)迫組件的object文件以‘a(chǎn)rm’(32位的指令)的模式生成,你可以將這個變量
??? 定義為'arm'。即:
????? LOCAL_ARM_MODE := arm
??? 注意,你也可以通過將‘.arm’后綴添加到源文件名字的后面指示生成系統(tǒng)將指定的
??? 源文件以arm模式生成。例如:
???
?????? LOCAL_SRC_FILES := foo.c bar.c.arm
??? 告訴生成系統(tǒng)總是以arm模式編譯‘bar.c’,但根據(jù)LOCAL_ARM_MODE的值生成foo.c
??? 注意:在你的Application.mk里將APP_OPTIM設(shè)置為'debug',這也會強(qiáng)迫生成ARM二進(jìn)制
??? 代碼。這是因?yàn)楣ぞ哝湹恼{(diào)度器有bugs,它對thumb碼的處理不是很好。
?
?
怎樣添加一個模塊
LOCAL_PATH:= $(call my-dir)
#編譯靜態(tài)庫
include $(CLEAR_VARS)
LOCAL_MODULE = libhellos
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hellos.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhellos
LOCAL_COPY_HEADERS := hellos.h
include $(BUILD_STATIC_LIBRARY)
#編譯動態(tài)庫
include $(CLEAR_VARS)
LOCAL_MODULE = libhellod
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hellod.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhellod
LOCAL_COPY_HEADERS := hellod.h
include $(BUILD_SHARED_LIBRARY)
BUILD_TEST=true
ifeq ($(BUILD_TEST),true)
#使用靜態(tài)庫
include $(CLEAR_VARS)
LOCAL_MODULE := hellos
LOCAL_STATIC_LIBRARIES := libhellos
LOCAL_SHARED_LIBRARIES :=
LOCAL_LDLIBS += -ldl
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := mains.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)
#使用動態(tài)庫
include $(CLEAR_VARS)
LOCAL_MODULE := hellod
LOCAL_MODULE_TAGS := debug
LOCAL_SHARED_LIBRARIES := libc libcutils libhellod
LOCAL_LDLIBS += -ldl
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := maind.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)
endif # ifeq ($(WPA_BUILD_SUPPLICANT),true)
########################
#local_target_dir := $(TARGET_OUT)/etc/wifi
#include $(CLEAR_VARS)
#LOCAL_MODULE := wpa_supplicant.conf
#LOCAL_MODULE_TAGS := user
#LOCAL_MODULE_CLASS := ETC
#LOCAL_MODULE_PATH := $(local_target_dir)
#LOCAL_SRC_FILES := $(LOCAL_MODULE)
#include $(BUILD_PREBUILT)
########################
系統(tǒng)變量解析
LOCAL_MODULE - 編譯的目標(biāo)對象
LOCAL_SRC_FILES - 編譯的源文件
LOCAL_C_INCLUDES - 需要包含的頭文件目錄
LOCAL_SHARED_LIBRARIES - 鏈接時需要的外部庫
LOCAL_PRELINK_MODULE - 是否需要prelink處理
BUILD_SHARED_LIBRARY - 指明要編譯成動態(tài)庫
LOCAL_PATH - 編譯時的目錄
$(call 目錄,目錄….) 目錄引入操作符
如該目錄下有個文件夾名稱 src,則可以這樣寫 $(call src),那么就會得到 src 目錄的完整路徑
include $(CLEAR_VARS) -清除之前的一些系統(tǒng)變量
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
在 build/core/config.mk 定義 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
通過include 包含自定義的.mk文件(即是自定義編譯規(guī)則)或是引用系統(tǒng)其他的.mk文件(系統(tǒng)定義的編譯規(guī)則)。
LOCAL_SRC_FILES - 編譯的源文件
可以是.c, .cpp, .java, .S(匯編文件)或是.aidl等格式
不同的文件用空格隔開。如果編譯目錄子目錄,采用相對路徑,如子目錄/文件名。也可以通過$(call 目錄),指明編譯某目錄
下所有.c/.cpp/.java/.S/ .aidl文件.追加文件 LOCAL_SRC_FILES += 文件
LOCAL_C_INCLUDES - 需要包含的頭文件目錄
可以是系統(tǒng)定義路徑,也可以是相對路徑. 如該編譯目錄下有個include目錄,寫法是include/*.h
LOCAL_SHARED_LIBRARIES - 鏈接時需要的外部共享庫
LOCAL_STATIC_LIBRA RIES - 鏈接時需要的外部外部靜態(tài)
LOCAL_JAVA_LIBRARIES 加入jar包
LOCAL_MODULE - 編譯的目標(biāo)對象
module 是指系統(tǒng)的 native code,通常針對c,c++代碼
./system/core/sh/Android.mk:32:LOCAL_MODULE:= sh
./system/core/libcutils/Android.mk:71:LOCAL_MODULE := libcutils
./system/core/cpio/Android.mk:9:LOCAL_MODULE := mkbootfs
./system/core/mkbootimg/Android.mk:8:LOCAL_MODULE := mkbootimg
./system/core/toolbox/Android.mk:61:LOCAL_MODULE:= toolbox
./system/core/logcat/Android.mk:10:LOCAL_MODULE:= logcat
./system/core/adb/Android.mk:65:LOCAL_MODULE := adb
./system/core/adb/Android.mk:125:LOCAL_MODULE := adbd
./system/core/init/Android.mk:20:LOCAL_MODULE:= init
./system/core/vold/Android.mk:24:LOCAL_MODULE:= vold
./system/core/mountd/Android.mk:13:LOCAL_MODULE:= mountd
LOCAL_PACKAGE_NAME?
Java 應(yīng)用程序的名字用該變量定義
./packages/apps/Music/Android.mk:9:LOCAL_PACKAGE_NAME := Music
./packages/apps/Browser/Android.mk:14:LOCAL_PACKAGE_NAME := Browser
./packages/apps/Settings/Android.mk:8:LOCAL_PACKAGE_NAME := Settings
./packages/apps/Stk/Android.mk:10:LOCAL_PACKAGE_NAME := Stk
./packages/apps/Contacts/Android.mk:10:LOCAL_PACKAGE_NAME := Contacts
./packages/apps/Mms/Android.mk:8:LOCAL_PACKAGE_NAME := Mms
./packages/apps/Camera/Android.mk:8:LOCAL_PACKAGE_NAME := Camera
./packages/apps/Phone/Android.mk:11:LOCAL_PACKAGE_NAME := Phone
./packages/apps/VoiceDialer/Android.mk:8:LOCAL_PACKAGE_NAME := VoiceDialer
BUILD_SHARED_LIBRARY - 指明要編譯成動態(tài)庫。
編譯的目標(biāo),用include 操作符
UILD_STATIC_LIBRARY來指明要編譯成靜態(tài)庫。
如果是java文件的話,會用到系統(tǒng)的編譯腳本host_java_library.mk,用BUILD_PACKAGE來指明。三個編譯
-------------------
include $(BUILD_STATIC_LIBRARY)
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
-------------------
include $(BUILD_SHARED_LIBRARY)
./build/core/config.mk:50:BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
-------------------
include $(BUILD_HOST_SHARED_LIBRARY)
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
-------------------
include $(BUILD_EXECUTABLE)
build/core/config.mk:51:BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
-------------------
include $(BUILD_HOST_EXECUTABLE)
./build/core/config.mk:53:BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
-------------------
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
-------------------
BUILD_JAVA_LIBRARY
./build/core/config.mk:58:BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
------------------
BUILD_STATIC_JAVA_LIBRARY 編譯靜態(tài)JAVA庫
./build/core/config.mk:59:BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
------------------
BUILD_HOST_JAVA_LIBRARY 編譯本機(jī)用的JAVA庫
./build/core/config.mk:60:BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
------------------
BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk
BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk
BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk
BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk
BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk
BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk
BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk
BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk
BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk
BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk
BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk
BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk
BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk
BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk
BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk
BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk
BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk
============
LOCAL_PRELINK_MODULE
Prelink利用事先鏈接代替運(yùn)行時鏈接的方法來加速共享庫的加載,它不僅可以加快起動速度,還可以減少部分內(nèi)存開銷,
是各種Linux架構(gòu)上用于減少程序加載時間、縮短系統(tǒng)啟動時間和加快應(yīng)用程序啟動的很受歡迎的一個工具。程序運(yùn)行時的
動態(tài)鏈接尤其是重定位(relocation)的開銷對于大型系統(tǒng)來說是很大的。
動態(tài)鏈接和加載的過程開銷很大,并且在大多數(shù)的系統(tǒng)上, 函數(shù)庫并不會常常被更動, 每次程序被執(zhí)行時所進(jìn)行的鏈接
動作都是完全相同的,對于嵌入式系統(tǒng)來說尤其如此。因此,這一過程可以改在運(yùn)行時之前就可以預(yù)先處理好,即花一些時間
利用Prelink工具對動態(tài)共享庫和可執(zhí)行文件進(jìn)行處理,修改這些二進(jìn)制文件并加入相應(yīng)的重定位等信息,節(jié)約了本來在程序
啟動時的比較耗時的查詢函數(shù)地址等工作,這樣可以減少程序啟動的時間,同時也減少了內(nèi)存的耗用。?
Prelink的這種做法當(dāng)然也有代價:每次更新動態(tài)共享庫時,相關(guān)的可執(zhí)行文件都需要重新執(zhí)行一遍Prelink才能保
證有效,因?yàn)樾碌墓蚕韼熘械姆栃畔ⅰ⒌刂返群芸赡芘c原來的已經(jīng)不同了,這就是為什么 android framework代碼一改動,
這時候就會導(dǎo)致相關(guān)的應(yīng)用程序重新被編譯。
這種代價對于嵌入式系統(tǒng)的開發(fā)者來說可能稍微帶來一些復(fù)雜度,不過好在對用戶來說幾乎是可以忽略的。
--------------------
變量設(shè)置為false那么將不做prelink操作
LOCAL_PRELINK_MODULE := false
默認(rèn)是需要prlink的,同時需要在 build/core/prelink-linux-arm.map 中加入
libhellod.so 0x96000000
這個map文件好像是制定動態(tài)庫的地址的,在前面注釋上面有一些地址范圍的信息,注意庫與庫之間的間隔數(shù),
如果指定不好的話編譯的時候會提示說地址空間沖突的問題。另外,注意排序,這里要把數(shù)大的放到前面去,
按照大小降序排序。
解析 LOCAL_PRELINK_MODULE 變量
build/core/dynamic_binary.mk:94:ifeq ($(LOCAL_PRELINK_MODULE),true)
ifeq ($(LOCAL_PRELINK_MODULE),true)
$(prelink_output): $(prelink_input) $(TARGET_PRELINKER_MAP) $(APRIORI)
$(transform-to-prelinked)
transform-to-prelinked定義:
./build/core/definitions.mk:1002:define transform-to-prelinked
define transform-to-prelinked
@mkdir -p $(dir $@)
@echo "target Prelink: $(PRIVATE_MODULE) ($@)"
$(hide) $(APRIORI) \
--prelinkmap $(TARGET_PRELINKER_MAP) \
--locals-only \
--quiet \
$< \
--output $@
endef
./build/core/config.mk:183:APRIORI := $(HOST_OUT_EXECUTABLES)/apriori$(HOST_EXECUTABLE_SUFFIX)
prelink工具不是常用的prelink而是apriori,其源代碼位于” <your_android>/build/tools/apriori”
參考文檔:
動態(tài)庫優(yōu)化——Prelink(預(yù)連接)技術(shù)
http://www.eefocus.com/article/09-04/71629s.html
===============
LOCAL_ARM_MODE := arm
目前Android大部分都是基于Arm處理器的,Arm指令用兩種模式Thumb(每條指令兩個字節(jié))和arm指令(每條指令四個字節(jié))
LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
通過設(shè)定編譯器操作,優(yōu)化級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高
LOCAL_CFLAGS += -W -Wall
LOCAL_CFLAGS += -fPIC -DPIC
LOCAL_CFLAGS += -O2 -g -DADB_HOST=1 -Wall -Wno-unused-parameter
LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY
LOCAL_CFLAGS += -DUSEOVERLAY2
根據(jù)條件選擇相應(yīng)的編譯參數(shù)
ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -DANDROID_GADGET=1
LOCAL_CFLAGS := $(PV_CFLAGS)
endif
ifeq ($(TARGET_BUILD_TYPE),release)
LOCAL_CFLAGS += -O2
endif
LOCAL_LDLIBS := -lpthread
LOCAL_LDLIBS += -ldl
ifdef USE_MARVELL_MVED
LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_mpeg4aspdecmved_wmmx2lnx lib_il_h264decmved_wmmx2lnx
LOCAL_SHARED_LIBRARIES += libMrvlMVED
else
LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_h264dec_wmmx2lnx lib_il_mpeg4aspdec_wmmx2lnx
endif
轉(zhuǎn)載于:https://www.cnblogs.com/codingking/archive/2013/01/29/2881143.html
總結(jié)
以上是生活随笔為你收集整理的Android.mk文件语法规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 矿机多少钱啊?
- 下一篇: 民政局补办结婚证流程