配置Android.mk文件

        Android.mk文件主要用來指定要編譯的c/c++源文件的位置。其核心部分是模塊---modules,可以在模塊中置頂c/c++源文件的位置。模塊可以用來指定靜態庫或共享庫,其中只用共享庫會被安裝或複製到Android應用程序包中,而靜態庫可以用來生成共享庫。

         編譯系統爲你處理許多細節問題。例如,你不需要在你 的Android.mk中列出頭文件和依賴文件。NDK編譯系統將會爲你自動處理這些問題。這也意味着,在升級NDK後,你應該得到新的 toolchain/platform支持,而且不需要改變你的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 $@)
@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”
參考文檔:
動態庫優化——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

發佈了22 篇原創文章 · 獲贊 22 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章