Android中增加本地程式或者庫,這些程式與其所在路徑沒有關係,只和它們的Android.mk有關係。 Android.mk與普通的makefile略有不同,Android.mk具有統一的寫法,主要包含一些系統的公共的巨集: Android.mk中選項參考以下文件路徑: build/core/con ...
Android中增加本地程式或者庫,這些程式與其所在路徑沒有關係,只和它們的Android.mk有關係。
Android.mk與普通的makefile略有不同,Android.mk具有統一的寫法,主要包含一些系統的公共的巨集:
Android.mk中選項參考以下文件路徑:
build/core/config.mk
各個選項的預設值在以下文件中定義:
build/core/base_config.mk
在一個android.mk中也可以生成多個可執行程式,動態庫,靜態庫。
1.編譯程式:
1.1 可執行程式模板:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES := \
main.c
LOCAL_MODULE := test_exe
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARISE :=
include $(BUILD_STATIC_LIBRAR)
LOCAL_PATH:= $(call my-dir)
此行代碼在Android.mk的開頭,用於給出當前文件的路徑:
LOCAL_PATH:
用於在開發樹中查找源文件;
巨集函數’my-dir’:
由編譯系統提供,用於返回當前路徑(即包含Android.mk file文件的目錄)
---
LOCAL_C_INCLUDES:
表示要加入所需要的包含頭文件的路徑
---
LOCAL_MODULE:
表示模塊最後最終名稱
---
LOCAL_STATIC_LIBRARIES:
加入所需要的連接的靜態庫
---
LOCAL_SHARED_LIBRARISE:
加入所需要的動態庫
最後使用include $(BUILD_EXECUTABLE)表示以一個可執行程式的方式進行編譯;最終生成的靜態庫為libtest_static.a;
1.2 編譯一個靜態庫
在Android.mk中編譯一個靜態庫的模板如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES := \
main.c
LOCAL_MODULE := libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARISE :=
include $(BUILD_STATIC_LIBRARY)
1.3 編譯一個動態庫
在Android.mk中編譯一個動態庫的模板如下所示:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
LOCAL_SRC_FILES := \
helloworld.c
LOCAL_MODULE := libtest_shared
TARGET_PRELINK_MODULE := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARISE :=
include $(BUILD_SHARED_LIBRARY)
同樣,最終生成的動態庫的名稱是libtest_shared.so;
1.4 編譯結果
可執行程式、靜態庫、動態庫生成的編譯結果分別為以下目錄:
out/target/product/xxxx/obj/EXECUTABLE
out/target/product/xxxx/obj/STATIC_LIBRARY
out/target/product/xxxx/obj/SHARED_LIBRARY
每一個模塊的目標文件夾分別為:
- 可執行文件:{XXX}_intermediates
- 靜態庫: {XXX}_static_intermediates
- 動態庫:{XXX}_shared__intermediates
在編譯過程中,可以編譯目標機的內容,也可以編譯主機的內容,可執行文件、動態庫、靜態庫使用巨集分別如下所示 :
include $(BUILD_EXECUTABLE)
include $(BUILD_STATIC_LIBRARY)
include $(BUILD_SHARED_LIBRARY)
編譯主機的內容,可執行文件、動態庫、靜態庫使用巨集分別如下所示 :
include $(BUILD_HOST_EXECUTABLE)
include $(BUILD_HOST_STATIC_LIBRARY)
include $(BUILD_HOST_SHARED_LIBRARY)
在android.mk中,可以指定最後目標安裝路徑,使用以下兩個巨集來指定:
LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)
LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)
不同文件系統使用以下巨集來進行選擇:
- TARGET_ROOT_OUT:根文件系統,路徑為:out/target/product/xxxx/root
- TARGET_OUT:表示system文件系統,路徑為:out/target/product/xxxx/system
- TARGET_OUT_DATA:表示data文件系統,路徑為:out/target/product/xxxx/data
2.安裝程式:
除了編譯各種內容外,有時還需要向目標文件系統複製一些文件,例如配置腳本、資源文件、預置的程式和庫等,也有時需要在目標文件系統中創建目錄;
在Android.mk,進行目錄創建和安裝的實例如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_PATH)
xxx(這裡使用正常makefile語法來編寫copy動作或者創建動作)
詳情看:
一個通用的makefile(一)
一個通用的Makefile(二)