Android.mk學習筆記
阿新 • • 發佈:2019-01-04
原文連結: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)
}