1. 程式人生 > >androd.mk 檔案語法規範

androd.mk 檔案語法規範

http://blog.163.com/[email protected]/blog/static/70234777201102611363180/

Android.mk檔案語法規範

序言:
-------------

此文件旨在描述Android.mk檔案的語法,Android.mk檔案為Android NDK(原生開發)描述了你C/C++原始檔。
為了明白下面的內容,你必須已經閱讀了docs/OVERVIEW.TXT的內容,它解釋了Android.mk檔案扮演的角色
和用途。

概述:
---------


寫一個Android.mk檔案是為了向生成系統描述你的原始碼。更明確的說:

- 這個檔案實際上是GNU Make檔案的一小片段,它會被生成系統解析一次或多次。
因此,你應該在Android.mk裡儘量少地宣告變數,而不要誤以為在解析的過程中
沒有任何東西被定義。

- 該檔案的語法的明的人為了讓你能將你的原始碼組織為元件(module).一個元件指的是下面的一項:
     - 一個靜態庫(static library)
     - 一個共享庫(shared library)

  
只有一個動態庫會被安裝/拷貝至你的application package中。但是靜態庫可用來
生成動態庫。

你可以在每個Android.mk檔案定義一個或多個元件,並且我可以在幾個元件中使用
相同的原始檔。


- 生成系統為你處理了一些瑣碎之事。比如,在你的Android.mk裡,你不須要列出標頭檔案或
列出生成的檔案之間的明確認依賴關係。NDK生成系統會為你自動生成。

這也意味著,當更新至新的NDK版本時,你能得到新的工具鏈/平臺支援(toolchain/platform support)
的好處,而無須修改你的android.mk檔案。

需要注意的是,此語法與完全開源的Android平臺的Android.mk檔案的語法非常相似,但使用它們的
生成系統的實現不同,這個為了讓開發者能更容易的複用“外部”庫的原始碼。


簡單例子:
---------------

在詳細描述語法之前,讓我們探究一個簡單的“hello JNI”例子,它的檔案位於:
    apps/hello-jni/projec

這裡,我們能看到:

- 放有Java原始檔的src資料夾。

- 放有本地原始檔,即jni/hello-jni.c的jni資料夾。

    這個原始檔實現一個簡單的共享庫。這個共享庫有一個本地方法(native method),它將一個字串
    返回給虛擬機器應用(著:即Java層應用程式)

- jni/Anroid.mk檔案為NDK生成系統描述了這個共享庫。它的內容為:

   ---------- 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 ------------------

現在,讓我們逐行解釋:

LOCAL_PATH := $(call my-dir)

每個Android.mk檔案都必須以定義LOCAL_PATH變數開始。其目的是為了定位原始檔的位置。在這個例子,
生成系統提供的巨集函式(macro function)‘my-dir'用來返回當前路徑(即放有Android.mk檔案的資料夾)

include $(CLEAR_VARS)

CLEAR_VARS變數是生成系統提供的,它指向一個特殊的GNU Makefile.這個Makefile將會為你自動清除
許多名為LOCAL_XXX的變數(比如:LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES,等),
但LOCAL_PATH是例外,它不會被清除。這些變數的清除是必須的,因為所有的控制檔案是在單一的GNU make
執行環境中解析的,在這裡所有的變數都是全域性的。

LOCAL_MODULE := hello-jni

為了在你的Android.mk檔案標識每個元件,必須定義LOCAL_MODULE變數。這個名字必須要唯一的並且不能
包含空格。注意:生成系統會自動地為相應生成的檔案加入字首或字尾。換言之,一個名叫foo的共享庫元件
會生成'libfoo.so'.

重要注意事項:
如果你把元件取名為‘libfoo',生成系統將不會加上‘lib'字首,還是
生成libfoo.so。這是為了支援源於Android平臺原始碼的Android.mk檔案。

LOCAL_SRC_FILES := hello-jni.c

LOCAL_SRC_FILES變數必須包含一系列將被構建和組合成元件的C/C++原始檔。注意:你
不需要列出標頭檔案或include檔案,因為生成系統會為你自動計算出原始檔的依賴關係。
僅僅列出那些將直接傳給編譯器的原始檔足矣。


注意,預設的C++原始檔的副檔名是‘.cpp'。但你可以通過定義LOCAL_DEFAULT_EXTENSION
來指定一個副檔名。別忘了副檔名開始的那一點(比如,‘.cxx’,能行,但‘cxx'不行)。

include $(BUILD_SHARED_LIBRARY)

生成系統提供的BUIL_SHARED_LIBRARY變數指向一個GNU Makefile指令碼,這個指令碼主管
收集在最近的一次#include $(CLEAR_VARS)(著:即清除'本地'變數)之後你所定義的
LOCAL_XXX變數的資訊,並決定生成什麼,如何準確的生成。BUILD_STATIC_LIBRARY可
生成一個靜態庫。

There are more complex examples under apps/, with commented
Android.mk files that you can look at.
在apps檔案下有一些複雜點的例子,它帶有註釋的Android.mk檔案以供你學習。

參考:
-----------

以下列出你在Android.mk裡應該依賴或定義的變數。你能定義其它變數,但下列的變數名是
由NDK生成系統保留的。

- 以LOCAL_ 開頭的變數名 (比如,LOCAL_MODULE)
- 以PRIVATE_ ,NDK_ 或 APP_ (內部使用)開頭的量名
_ 小寫字母變數名(內部使用,如 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被解析之前,就被生成系統事先定義
的了.注意,在某些情況下,NDK可能會多次解析你的Android.mk,每次對其中一些變數的
定義不同。

CLEAR_VARS
    指向一個生成指令碼,這個指令碼取消幾乎所有LOCAL_XXX變數的定義(譯者注:除了LOCAL_PATH)。
    在開始描述一個新的元件之前,你必須include這個指令碼,e.g.:
   
      include $(CLEAR_VARS)
   
   
BUILD_SHARED_LIBRARY
   指向一個生成指令碼,這個指令碼通過LOCAL_XXX變數收集關於元件的資訊,並決定如何
   根據你列出來的原始檔生成目標分享庫。注意,在include這個指令碼檔案之前你必須
   至少已經定義了LOCAL_MODULE和LOCAL_SRC_FILES。用法舉例:
     include $(BUILD_SHARED_LIBRARY)
    
   注意,這會生成一個名為 lib$(LOCAL_MODULE).so的檔案。(譯者注:$(BUILD_SHARED_MODULE)為檔名)

   
BUILD_STATIC_LIBRARY
    與BUILD_SHARED_LIBRARY類似,但用來生成目標靜態庫。靜態庫不會被拷貝至你的
    project/packages資料夾下,但可用來生成分享庫(參考 LOCAL_STATIC_LIBRARIES
    和LOCAL_STATIC_WHOLE_LIBRARIES,將在後面描述)
    用法示例:

       include $(BUILD_STATIC_LIBRARY)

    注意,這會生成一個方件名叫lib$(LOCAL_MODULE).a
   

TARGET_ARCH
   目標CPU的名字,在完整的Android開原始碼的生成中指定。對於基於ARM相容的CPU,
   它被指定為'arm',與CPU架構的修訂無關。
   
  
TARGET_PLATFORM
   當解析該Android.mk檔案時用它來指定Andoid目標平臺的名稱。譬如,'android-3'與
   Android 1.5系統映象相對應。若要了解所有的平臺名稱及其相應的Android系統映象,
   請閱讀docs/STABLE-APIS.TXT

   
TARGET_ARCH_ABI
    當解析該Android.mk時,CPU+ABI的名稱。目前只有一個值。
    (譯者注:ABI,Application Binary Interface,二進位制應用程式介面)

       armeabi    For Armv5TE
      
       armeabi    指定Armv5TE
         
    注意:到NDK 1.6_r1為止,僅簡單的定義這個變數為'arm'。但為了更好地配合
    Android平臺的內部使用,該值已重定義。
   
    關於ABI與相應的相容問題更多詳情,請閱讀docs/CPU-ARCH-ABIS.TXT

    未來的NDK版本將會引入其它的平臺的ABI並會有不同的名稱。注意,所有基於ARM的ABI會
    使TARGET_ARCH定義為'arm',但可能擁有不同的TARGET_ARCH_ABI
  
   
TARGET_ABI  
    目標平臺與abi的連線,它實際上被定義為 $(TARGET_PLATFORM)-$(TARGET_ARCH_ABI),
    當你想在一個真實的裝置上測試特定的目標系統映象時,它就很有用了。
   
    預設下,它的值為'android-3-armeabi'
   
    (在Android NDK 1.6_r1及之前的版本,它的預設值為'android-3-arm')
   
   

NDK提供的巨集函式:
----------------------------

以下是一些GNU Make的巨集‘函式’,必須通過這樣的形式呼叫:'$(call <function>)'。
函式返回文字資訊。
       
my-dir
    返回放置當前Android.mk的資料夾相對於NDK生成系統根目錄的路徑。可用來
    在Android.mk的開始處定義LOCAL_PATH的值:
   
       LOCAL_PATH := $(call my-dir)      

       
all-subdir-makefiles
      返回‘my-dir’子目錄下的所有Android.mk。比如,程式碼的結構如下:
     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
   
    這個函式能將深層巢狀的程式碼資料夾提供給生成系統。注意,預設情況下,NDK僅在
    source/*/Android.mk裡尋找檔案。

   
this-makefile
     返回當前Makefile(譯者注:指的應該是GNU Makefile)的路徑(即,這個函式是在哪裡呼叫的)


parent-makefile
     返回在列入樹(inclusion tree)中的父makefile的路徑。
    即,包含當前makefile的那個makefile的路徑。  


grand-parent-makefile
    猜猜看...(譯者注:原文為Guess what...)


元件描述相關的變數:
- - - - - - - - - -


以下的變數是用來向生成系統描述你的元件的。你應該在'include $(CLEAR_VARS)'
和'include $(BUILD_XXXXX)'之間定義其中的一些變數。正如在前面所說的,$(CLEAR_VARS)
是一個將會取消所有這些變數的指令碼,除非在對變數的描述時有顯式的說明。

   
LOCAL_PATH
   這個變數用來設定當前檔案的路徑。你必須在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
   用它來定義所有用來生成元件的原始檔。僅須列出傳給編譯器的檔案,因為
   生成系統會自動地計算它們的相互依賴關係。
  
   注意,所有檔名都是相對於LOCAL_PATH的,你可以用到路徑元件(path component)
   如:
     LOCAL_SRC_FILES := foo.c / (譯者注:‘/’為連線符)
                         toto/bar.c

       
LOCAL_CPP_EXTENSION
   這是一個可選的變數,可用它來指明C++原始檔的副檔名。預設情況下是'.cpp',
   但你可以改變它。比如:
    
     LOCAL_CPP_EXTENSION := .cxx

      
    
LOCAL_C_INCLUDES
   一個相對於相對於NDK*根*目錄可選的路徑名單,當編譯所有的原始檔(C,C++和彙編)時,
   它將被新增進include搜尋路徑。例如:
   
      LOCAL_C_INCLUDES := sources/foo
  
     或者甚至:
    
      LOCAL_C_INCLUDES := $(LOCAL_PATH)/../foo


LOCAL_CFLAGS
    一個可選的編譯標記集,在生成C與C++原始檔時,將解析它。
   
    對指定額外的巨集定義或編譯選項很有用。
              
    重要:不要試圖改變你Android.mk裡的optimization/debuggin level,通過
          在你的Android.mk裡指定合適的資訊,它將被自動處理,並使NDK生成
          除錯時可用的有用的資料檔案。
         
    注意:在android-ndk-1.5_r1,相應的標記(flags)只適用於C原始檔,對C++
        原始檔並不適用。為了適用於完整的Android生成系統的特性,已作了修
        正。(現在,你可以使用LOCAL_CPPFLAGS為C++檔案指定標記)

LOCAL_CXXFLAGS
    LOCAL_CPPFLAGS的別名。注意,不建議使用這個變數,因為在未來的NDK版本中,
    它可能會消失。

LOCAL_CPPFLAGS
     一個可選的編譯標記集,*僅*在生成C++原始檔時解析它。在編譯器的命令列裡
     它將在LOCAL_CFLAGS之後出現。

    注意:在android-ndk-1.5_r1,相應的標記(flags)適用於C與C++原始檔。
        為了適用於完整的Android生成系統的特性,已作了修
        正。(現在,你可以使用LOCAL_CFLAGS為C和C++原始檔指定標記)

LOCAL_STATIC_LIBRARIES
    一份static libraries元件的名單(以BUILD_STATIC_LIBRARY的方式生成),它將被
    連線到欲生成的元件上。這僅在生成shared library元件時有意義。(譯者注:將指定
    的一個或多個static library module轉化為一個shared library module)

LOCAL_SHARED_LIBRARIES
    一份該元件在執行期依賴於它的shared libraries *元件*。在連線時間(link time)裡
    與及為該生成的檔案嵌入相應的資訊都要用到它。

    注意,它並不將這份元件名單新增入生成圖表(build graph)。即,在你的Android.mk
    裡,你仍應該將它們加入到你的應用程式要求的元件。

LOCAL_LDLIBS
    一份能在生成你的元件時用到的額外的聯結器標記(linkerflags)的名單。在傳遞
    有“-l”字首的特殊系統庫的名稱時很有用。比如,下面的語句會告訴聯結器在裝載
    時間(load time)裡生成連線到/system/lib/libz.so的元件。

      LOCAL_LDLIBS := -lz

    若想知道在這個NDK版本可以連線哪些暴露的系統庫(exposed system libraries),
    請參見docs/STABLE-APIS。

LOCAL_ALLOW_UNDEFINED_SYMBOLS
    預設值情況下,當嘗試生成一個shared library遇到沒有定義的引用時,會導致“undefined
    symbol”error。這對在你的原始碼裡捕捉bugs有很大的幫助。
   
    但是,因為一些原因你須要disable這個檢查,將這個變數設定為'true’。注意,相應
    的shared library可能在執行期裝載失敗。

LOCAL_ARM_MODE
    預設值情況下,ARM目標二進位制將會以‘thumb’模式生成,這時每個指令都是16-bit寬的。
    如果你想強迫元件的object檔案以‘arm’(32位的指令)的模式生成,你可以將這個變數
    定義為'arm'。即:

      LOCAL_ARM_MODE := arm

    注意,你也可以通過將‘.arm’字尾新增到原始檔名字的後面指示生成系統將指定的
    原始檔以arm模式生成。例如:
   

       LOCAL_SRC_FILES := foo.c bar.c.arm

    告訴生成系統總是以arm模式編譯‘bar.c’,但根據LOCAL_ARM_MODE的值生成foo.c

    注意:在你的Application.mk裡將APP_OPTIM設定為'debug',這也會強迫生成ARM二進位制
    程式碼。這是因為工具鏈的排程器有bugs,它對thumb碼的處理不是很好。

////////////////////////////////////////////////////////////////////////

怎樣新增一個模組
LOCAL_PATH:= $(call my-dir)
#編譯靜態庫
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)

#編譯動態庫
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)
#使用靜態庫
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)

#使用動態庫
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)
########################
系統變數解析
LOCAL_MODULE - 編譯的目標物件
LOCAL_SRC_FILES - 編譯的原始檔
LOCAL_C_INCLUDES - 需要包含的標頭檔案目錄
LOCAL_SHARED_LIBRARIES - 連結時需要的外部庫
LOCAL_PRELINK_MODULE - 是否需要prelink處理
BUILD_SHARED_LIBRARY - 指明要編譯成動態庫


LOCAL_PATH - 編譯時的目錄
$(call 目錄,目錄….) 目錄引入操作符
如該目錄下有個資料夾名稱 src,則可以這樣寫 $(call src),那麼就會得到 src 目錄的完整路徑

include $(CLEAR_VARS) -清除之前的一些系統變數
CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
在 build/core/config.mk 定義 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
通過include 包含自定義的.mk檔案(即是自定義編譯規則)或是引用系統其他的.mk檔案(系統定義的編譯規則)。

LOCAL_SRC_FILES - 編譯的原始檔
可以是.c, .cpp, .java, .S(彙編檔案)或是.aidl等格式
不同的檔案用空格隔開。如果編譯目錄子目錄,採用相對路徑,如子目錄/檔名。也可以通過$(call 目錄),指明編譯某目錄
下所有.c/.cpp/.java/.S/ .aidl檔案.追加檔案 LOCAL_SRC_FILES += 檔案

LOCAL_C_INCLUDES - 需要包含的標頭檔案目錄
可以是系統定義路徑,也可以是相對路徑. 如該編譯目錄下有個include目錄,寫法是include/*.h

LOCAL_SHARED_LIBRARIES - 連結時需要的外部共享庫
LOCAL_STATIC_LIBRA RIES - 連結時需要的外部外部靜態
LOCAL_JAVA_LIBRARIES 加入jar包

LOCAL_MODULE - 編譯的目標物件
module 是指系統的 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 應用程式的名字用該變數定義
./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 - 指明要編譯成動態庫。
編譯的目標,用include 操作符
UILD_STATIC_LIBRARY來指明要編譯成靜態庫。
如果是java檔案的話,會用到系統的編譯指令碼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 編譯靜態JAVA庫
./build/core/config.mk:59:BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk
------------------
BUILD_HOST_JAVA_LIBRARY 編譯本機用的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利用事先連結代替執行時連結的方法來加速共享庫的載入,它不僅可以加快起動速度,還可以減少部分記憶體開銷,
是各種Linux架構上用於減少程式載入時間、縮短系統啟動時間和加快應用程式啟動的很受歡迎的一個工具。程式執行時的
動態連結尤其是重定位(relocation)的開銷對於大型系統來說是很大的。
動態連結和載入的過程開銷很大,並且在大多數的系統上, 函式庫並不會常常被更動, 每次程式被執行時所進行的連結
動作都是完全相同的,對於嵌入式系統來說尤其如此。因此,這一過程可以改在執行時之前就可以預先處理好,即花一些時間
利用Prelink工具對動態共享庫和可執行檔案進行處理,修改這些二進位制檔案並加入相應的重定位等資訊,節約了本來在程式
啟動時的比較耗時的查詢函式地址等工作,這樣可以減少程式啟動的時間,同時也減少了記憶體的耗用。
Prelink的這種做法當然也有代價:每次更新動態共享庫時,相關的可執行檔案都需要重新執行一遍Prelink才能保
證有效,因為新的共享庫中的符號資訊、地址等很可能與原來的已經不同了,這就是為什麼 android framework程式碼一改動,
這時候就會導致相關的應用程式重新被編譯。
這種代價對於嵌入式系統的開發者來說可能稍微帶來一些複雜度,不過好在對使用者來說幾乎是可以忽略的。
--------------------
變數設定為false那麼將不做prelink操作
LOCAL_PRELINK_MODULE := false
預設是需要prlink的,同時需要在 build/core/prelink-linux-arm.map 中加入
libhellod.so 0x96000000
這個map檔案好像是制定動態庫的地址的,在前面註釋上面有一些地址範圍的資訊,注意庫與庫之間的間隔數,
如果指定不好的話編譯的時候會提示說地址空間衝突的問題。另外,注意排序,這裡要把數大的放到前面去,
按照大小降序排序。
解析 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 [email protected])
@echo "target Prelink: $(PRIVATE_MODULE) ([email protected])"
$(hide) $(APRIORI) /
--prelinkmap $(TARGET_PRELINKER_MAP) /
--locals-only /
--quiet /
$< /
--output [email protected]
endef
./build/core/config.mk:183:APRIORI := $(HOST_OUT_EXECUTABLES)/apriori$(HOST_EXECUTABLE_SUFFIX)
prelink工具不是常用的prelink而是apriori,其原始碼位於” <your_android>/build/tools/apriori”
參考文件:
動態庫優化——Prelink(預連線)技術
http://www.eefocus.com/article/09-04/71629s.html


===============
LOCAL_ARM_MODE := arm
目前Android大部分都是基於Arm處理器的,Arm指令用兩種模式Thumb(每條指令兩個位元組)和arm指令(每條指令四個位元組)

LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays
通過設定編譯器操作,優化級別,-O0表示沒有優化,-O1為預設值,-O3優化級別最高
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
根據條件選擇相應的編譯引數
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

相關推薦

androd.mk 檔案語法規範

http://blog.163.com/[email protected]/blog/static/70234777201102611363180/ Android.mk檔案語法規範 序言: ------------- 此文件旨在描述Android.

Android.mk檔案語法規範及使用

1.概述Android.mk編譯檔案是用來向Android NDK描述你的C,C++原始碼檔案的。具體來說:該檔案是GNU Makefile的一小部分,會被編譯系統解析一次或更多次的build系統。因此,您應儘量減少您宣告的變數,不要認為某些變數在解析過程中不會被定義。這

Android.mk檔案語法規範——深入瞭解android平臺的jni

Android.mk是Android提供的一種makefile檔案,用來指定諸如編譯生成so庫名、引用的標頭檔案目錄、需要編譯的.c/.cpp檔案和.a靜態庫檔案等。要掌握jni,就必須熟練掌握Android.mk的語法規範。 一、Android.mk檔案的用途一個andr

Android.mk檔案語法詳解

原文地址為:Android.mk 檔案語法詳解 轉:http://blog.sina.com.cn/s/blog_602f8770010148ce.html ===============================================================

Android.mk 檔案語法詳解

===================================================================================== 0. Android.mk簡介: Android.mk檔案用來告知NDK Build 系統關於Sou

安卓Android.mk 檔案語法詳解

0. Android.mk簡介: Android.mk檔案用來告知NDK Build 系統關於Source的資訊。 Android.mk將是GNU Makefile的一部分,且將被Build System解析一次或多次。 所以,請儘量少的在Android.mk中宣告

NDK 編譯和使用靜態庫、動態庫; Android.mk 檔案語法詳解; Android.mk高階寫法

===================================================================================== 0. Android.mk簡介: Android.mk檔案用來告知NDK Build 系統關於Source的資訊。 Andro

android.mk檔案語法總結

LOCAL_PATH := $(call my-dir)//指定本地路徑,通常是android.mk檔案所在路徑     include $(CLEAR_VARS)//這兩行必須要     LOCAL_MODULE    := OgreGLES2Sample//指定模組名,

Android.mk入門到精通(001)——Android.mk 檔案語法詳解:神文

https://www.cnblogs.com/wainiwann/p/3837936.html 0. Android.mk簡介: Android.mk檔案用來告知NDK Build 系統關於Source的資訊。 Android.mk將是GNU Makefile的一部分,

Android.mk檔案語法詳述

介紹:------------這篇文件是用來描述你的C或C++原始檔中Android.mk編譯檔案的語法的,為了理解她們我們需要您先看完docs/OVERVIEW.html(http://hualang.iteye.com/blog/1135105)檔案來了解它的作用概覽:

Android.mk 檔案語法大全

講解如下:LOCAL_PATH := $(call my-dir) 每個Android.mk檔案必須以定義LOCAL_PATH為開始。它用於在開發tree中查詢原始檔。巨集my-dir 則由Build System提供。返回包含Android.mk的目錄路徑。include $(CLEAR_VARS)CLE

Android .mk檔案語法解析

下面是MTK-AndroidFM模組Android .mk程式碼內容: 1 ifeq ($(MTK_FM_SUPPORT),yes) 2 LOCAL_PATH:= $(call my-dir) 3 include $(CLEAR_VARS) 4 LOCAL_MODULE_T

Android mk和Application mk文件語法規範說明及舉例

form lac run ipp man agg rom mes ica 以下英文內容摘自:http://www.kandroid.org/ndk/docs/OVERVIEW.htmlThe Android NDK is a set of tools that allow

Android.mk語法規範

Android.mk是Android提供的一種makefile檔案,用來指定諸如編譯生成so庫名、引用的標頭檔案目錄、需要編譯的.c/.cpp檔案和.a靜態庫檔案等。要掌握jni,就必須熟練掌握Android.mk的語法規範。 一、Android.mk檔案的用途一個andr

xml語法規範

res utf-8 ice rod 1.0 ted 子元素 -- 電子琴 <?xml version="1.0" encoding="utf-8"?> <!-- 聲明 --> <productList> <!-- 根元素,一

JSLint檢測Javascript語法規範

sin 大寫字母 之前 before sco document cts secure 使用 “Missing semicolon.” : “缺少分號.”,(這個一般都是自己忘記寫了,但是有一個需要註意的是,對於只有一句的結構,後面也需要寫分號。)“Use the funct

第十章 語法規範

reference 處理 規範化 語法 https 化工 編碼 auto python 1.PEP8編碼規範 https://www.python.org/dev/peps/pep-0008 2.規範化工具 pip3 install autopep8 Pycharm工具

編寫Android.mk檔案備錄

前言:     由於目前供職於機器人公司,從事基於android系統的軟體開發,因此常常需要進行原始碼編譯(當然也可以基於機器人的sdk和android studio環境進行開發)。   進行原始碼編譯,少不了編寫Android.mk檔案。通常類比前人的Android.mk檔案修修改

LeakCanary Android 記憶體洩漏分析利器 原始碼編譯配置mk檔案

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_SRC_

Android studio 使用自定義mk檔案編譯jni專案

最近將公司ndk專案從eclipse遷移到as,為了方便省事,直接使用原有mk檔案。參考網路資料,順利完成遷移工作。現貼出使用自定義mk檔案的關鍵程式碼,mark以備後面使用。 buildTypes { release { minifyEna