REF//
http://heaven.branda.to/~thinker/GinGin_CGI.py/show_id_doc/393
http://orsonlife.blogspot.tw/2009/12/androidmk.html
http://blog.csdn.net/yili_xie/article/details/4906865

Android building system 包括幾種重要的設定檔,
(1) Android.mk
(2) AndroidProducts.mk
(3) target_-.mk, host_-.mk and -.mk
(4) BoardConfig.mk
(5) buildspec.mk

Android.mk 是 module 和 package 的設定檔,每個 module/package 的目錄下都會有一個 Android.mk。所謂的 module 是指系統的 native code ,相對於用 Java 寫成的 Android application 稱為 package。

AndroidProducts.mk 則設定 product 配置。 product 即特定系統版本,透過編譯不同 product ,產生不同軟體配置內容,安裝不同的 application。 Product 可視為特定專案,產生特定規格系統。

BoardConfig.mk 是為 product 主板做設定,像是 driver 選擇、設定。*-.mk 則是針對選擇的作業系統和 CPU 架構,進行相關設定。

buildspec.mk 是位於 source 根目錄下,為進行編譯者所做之額外設定。例如,可在此選擇要產生的 product 、平台、額外的 module/package 等。

在 build/envsetup.sh 實作一個 mm 指令,以編譯單一 module,不需編譯整個 source tree。
HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 產生 binary 的目的為 debug 或 release 。透過設定此二變數,能產生包含 debug information 的 binry 。 debug or release 這些參數,也可設於 buildspec.mk 裡,以避免開發過程不斷的重新指定。

一般編輯整個 Android 系統,就是使用 droid 這個 goal。 droid 會產生一個完整的系統,包括 bootloader、kernel、系統程式、模組和應用程式。
showcommands 和 droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。透過 showcommands 這個 goal, building system 顯示過程中每一個步驟的詳細指令。

這邊詳細介紹可以參考資料,下面介紹常用的 Android.mk 寫法。
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

#Compile Static Lib
LOCAL_MODULE = libhello
LOCAL_CFLAGS = $(L_CFLAGS)
LOCAL_SRC_FILES = hello.c
LOCAL_C_INCLUDES = $(INCLUDES)
LOCAL_SHARED_LIBRARIES := libcutils
LOCAL_COPY_HEADERS_TO := libhello
LOCAL_COPY_HEADERS := hello.h
include $(BUILD_STATIC_LIBRARY)

#Compile Share Lib
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
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)

BUILD_TEST=true
ifeq ($(BUILD_TEST),true)
#Use Static Lib
LOCAL_MODULE := hello
LOCAL_STATIC_LIBRARIES := libhello
LOCAL_SHARED_LIBRARIES :=
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := mains.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)

#Use Share Lib
LOCAL_MODULE := hellod
LOCAL_MODULE_TAGS := debug
LOCAL_SHARED_LIBRARIES := libc libcutils libhellod
LOCAL_CFLAGS := $(L_CFLAGS)
LOCAL_SRC_FILES := maind.c
LOCAL_C_INCLUDES := $(INCLUDES)
include $(BUILD_EXECUTABLE)
endif
變數說明:
LOCAL_MODULE:編譯的目標
LOCAL_SRC_FILES:編譯的文件
LOCAL_PRELINK_MODULE:是否需要 Prelink 處理
LOCAL_PATH:編譯的目錄,$(call 目錄,目錄….)
如該目錄下有文件夾名稱 src,則可以寫 $(call src),這樣就會得到 src 的完整路路徑。
CLEAR_VARS:清除之前的一些系統變數,CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk
LOCAL_C_INCLUDES:需要包含的文件目錄,也可以是相對路徑。
如該編譯目錄下有個 include 目錄,寫法是 include/*.h
LOCAL_CFLAGS += -O3 -fstrict-aliasing:設定編譯參數
LOCAL_JAVA_LIBRARIES:加入 jar
LOCAL_PACKAGE_NAME:Java AP 的名字要用此變數定義
LOCAL_STATIC_LIBRARIES:Link 時需要的外部靜態LIB
LOCAL_SHARED_LIBRARIES:Link 時需要的外部動態LIB
BUILD_SHARED_LIBRARY:指定要編譯成動態LIB
BUILD_STATIC_LIBRARY:指定要編譯成靜態LIB
BUILD_EXECUTABLE:指定要編譯成執行檔
BUILD_STATIC_JAVA_LIBRARY:指定要編譯成靜態 JAVA LIB
LOCAL_ALLOW_UNDEFINED_SYMBOLS:default false,但有未定義的函數會出現 "undefined symbol" error,可以設為"true"避過該錯誤訊息。

# 如果是 ARM 平台可加入該變數
LOCAL_ARM_MODE := arm
# Arm 有兩種模式 Thumb 和 arm 指令

# 下面是根據條件選擇相對應編譯參數寫法
ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -DANDROID_GADGET=1
else
LOCAL_CFLAGS := $(PV_CFLAGS)
endif

ifeq (,$(filter -DWITHOUT_NERO_SPU=1, $(RMCFLAGS)))
LOCAL_LDFLAGS += -lndsp
endif
另外注意 Android C 已包括對 pthread 的支援,所以 LOCAL_LIBS := -lpthread 是不需要的。

Q: liner ERROR
bionic/linker/linker.c:1469| ERROR: 1638 In 'libplay.so', can't locate symbol IndexCreator
bionic/linker/linker.c:1940| ERROR: failed to link libplay.so

A: 是 SHARED LIBRARIES 順序問題,調整之後OK!

BB 發表在 痞客邦 PIXNET 留言(0) 人氣()