Android.mk學習筆記


原創作品 轉載請注明出處:http://www.cnblogs.com/langlang/

作者email: dayhappyhappy@163.com

 

 hardware\led\led\Android.mk

LOCAL_PATH := $(call my-dir)
{
    首先需要指定LOCAL_PATH變量,用於查找源文件
    上面的語句的意思是將LOCAL_PATH變量定義成本文件所在目錄路徑
}

#Android.mk中可以定義多個編譯模塊,每個編譯模塊都是以include $(CLEAR_VARS)開始
#以include $(BUILD_XXX)結束。
include $(CLEAR_VARS)  // 開始
{
    問: CLEAR_VARS是什么??
    答: CLEAR_VARS由編譯系統提供,指定讓GNU MAKEFILE為你清除除LOCAL_PATH以外的所有LOCAL_XXX變量,
    如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。    
}
#包含的頭文件
LOCAL_C_INCLUDES += \
    hardware/led/include/

LOCAL_PRELINK_MODULE :=  false   //  :=是賦值的意思
LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)/hw 
{
     // LOCAL_MODULE_PATH: 最后的目標安裝路徑
    
    問: TARGET_OUT_SHARED_LIBRARIES是什么?
    答: 在build/core/envsetup.mk中定義。TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib
    TARGET_ROOT_OUT:表示根文件系統。
    TARGET_OUT:表示system文件系統。
    TARGET_OUT_DATA:表示data文件系統。
    
}
LOCAL_SHARED_LIBRARIES := liblog   // LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動態庫(*.so)的名稱
LOCAL_SRC_FILES := led.cpp
LOCAL_MODULE :=led. default    // LOCAL_MODULE表示模塊最終的名稱
#LOCAL_MODULE的定義規則,led后面跟有default,led.default能夠保證我們的模塊總能被硬象抽象層加載到
LOCAL_MODULE_TAGS := eng
include $(BUILD_SHARED_LIBRARY)  //  結束
{
    include $(BUILD_STATIC_LIBRARY)表示編譯成靜態庫
    include $(BUILD_SHARED_LIBRARY)表示編譯成動態庫。
    include $(BUILD_EXECUTABLE)表示編譯成可執行程序
}

LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,
LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態庫(*.a)的名稱,
LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動態庫(*.so)的名稱,
LOCAL_MODULE表示模塊最終的名稱,BUILD_EXECUTABLE表示以一個可執行程序的方式進行編譯。



hardware\led\Android.mk
include $(call all-subdir-makefiles)


frameworks\ base\services\forlinx_led_jni\LedService.cpp
frameworks\ base\services\forlinx_led_jni\Android.mk
{

    LOCAL_PATH:= $(call my-dir)  // LOCAL_PATH變量定義成本文件所在目錄路徑
    include $(CLEAR_VARS)
    
    # [optional, user, eng] 
    # eng = required
    # optinal = no install on target
    LOCAL_MODULE_TAGS := eng
    {
        LOCAL_MODULE_TAGS :=optional -->>  out/target/product/OK6410/symbols/system/
        LOCAL_MODULE_TAGS :=eng    -->>  out/target/product/Ok6410/system/
    }
    
    # This  is the target being built.
    LOCAL_MODULE:= libforlinx_runtime
    
    # Target install path.
    LOCAL_MODULE_PATH := $(TARGET_OUT_SHARED_LIBRARIES)
    
    # All of the source files that we will compile.
    LOCAL_SRC_FILES:= \
        LedService.cpp
    
    # All of the shared libraries we link against.
    LOCAL_SHARED_LIBRARIES := \
        libandroid_runtime \
        libcutils \
        libhardware \
        libhardware_legacy \
        libnativehelper \
            libsystem_server \
        libutils \
        libui \
            libsurfaceflinger_client
        
    
    # Also need the JNI headers.
    LOCAL_C_INCLUDES += \
        $(JNI_H_INCLUDE) \
            hardware/led/include
    
    
    # No specia compiler flags.
    LOCAL_CFLAGS +=
    {
        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
        根據條件選擇相應的編譯參數
    }
    
    # Don ' t prelink this library.  For more efficient code, you may want
    # to add  this library to the prelink map and  set  this to  true.
    LOCAL_PRELINK_MODULE :=  false
    {
            Prelink利用事先鏈接代替運行時鏈接的方法來加速共享庫的加載,它不僅可以加快起動速度,還可以減少部分內存開銷,
        是各種Linux架構上用於減少程序加載時間、縮短系統啟動時間和加快應用程序啟動的很受歡迎的一個工具。程序運行時的
        動態鏈接尤其是重定位(relocation)的開銷對於大型系統來說是很大的。
        動態鏈接和加載的過程開銷很大,並且在大多數的系統上, 函數庫並不會常常被更動, 每次程序被執行時所進行的鏈接
        動作都是完全相同的,對於嵌入式系統來說尤其如此。因此,這一過程可以改在運行時之前就可以預先處理好,即花一些時間
        利用Prelink工具對動態共享庫和可執行文件進行處理,修改這些二進制文件並加入相應的重定位等信息,節約了本來在程序
        啟動時的比較耗時的查詢函數地址等工作,這樣可以減少程序啟動的時間,同時也減少了內存的耗用。 
        Prelink的這種做法當然也有代價:每次更新動態共享庫時,相關的可執行文件都需要重新執行一遍Prelink才能保
        證有效,因為新的共享庫中的符號信息、地址等很可能與原來的已經不同了,這就是為什么 android framework代碼一改動,
        這時候就會導致相關的應用程序重新被編譯。
        這種代價對於嵌入式系統的開發者來說可能稍微帶來一些復雜度,不過好在對用戶來說幾乎是可以忽略的。
    }
    
    include $(BUILD_SHARED_LIBRARY)
}

 


免責聲明!

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



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