1. 程式人生 > >Android.mk學習筆記

Android.mk學習筆記

原文連結:http://www.cnblogs.com/langlang/

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