原創作品 轉載請注明出處: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)
}
{
首先需要指定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)
}