標籤:
原文網址:http://blog.csdn.net/louiswangbing/article/details/6616202
Android底層庫和程式
1、 本地實現的基本結構
Android的本地實現層次具有基本的庫和程式,這些庫和程式是Android基本系統啟動並執行基礎,主要包含以下內容:
l 標準C/C++庫Bionic;
l C語言工具庫libcutils;
l init進程;
l shell工具;
l C++工具庫libutils。
2、 增加本地庫的方法
Android中增加本地庫或者程式,與其代碼路徑無關,只和他們的Android.mk檔案有關係。
Android.mk和普通的makefile略有不同,具有統一的寫法,主要包括一些系統公用的宏定義。
Android.mk中選項參考以下檔案路徑:
build/core/config.mk
各個選項的預設值在以下檔案中定義:
build/core/base_rules.mk
在一個Android.mk中也可以產生多個可執行程式、動態庫或者靜態庫。
在Android中編譯一個可執行程式的模板如下所示:
# test exe
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
main.c
LOCAL_MODULE :=test_exe
#LOCAL_C_INCLUDES:=
#LOCAL_STATIC_LIBRARIES:=
# LOCAL_SHARED_LIBRARIES:=
include $(BUILD_EXECUTABLE)
編譯一個可執行程式,需要在LOCAL_SRC_FILES中啊計入源檔案路徑(相當與當前的目錄),在LOCAL_C_INCLUDES加入所需要包含的標頭檔路徑,在LOCAL_STATIC_LIBRARIES中加入所需要串連的靜態庫(.a)的名稱,在LOCAL_SHARED_LIBRARIES中加入所需要串連的動態庫(.so)的名稱。LOCAL_MODULE表示模組最終的名稱。最後,使用include $(BUILD_EXECUTABLE)表示以一個可執行程式的方式進行編譯。在本例中LOCAL_MODULE被定義為test_exe,因此最終產生的可執行程式的名稱是test_exe。
在Android.mk中編譯一個靜態庫的模板如下所示:
# test staticlib
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
main.c
LOCAL_MODULE :=libtest_static
#LOCAL_C_INCLUDES:=
#LOCAL_STATIC_LIBRARIES:=
# LOCAL_SHARED_LIBRARIES:=
include $(BUILD_STATIC_LIBRARY)
編譯一個靜態庫,基本的內容和編譯可執行程式相似,區別在於使用include $(BUILD_STATIC_LIBRARY)表示編譯靜態庫,本例中LOCAL_MODULE被定義為libtest_static,所以最終產生的靜態庫的名稱是libtest_static.a。
在Android.mk中編譯一個動態庫的模板如下所示:
# test sharedlib
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
main.c
LOCAL_MODULE :=libtest_shared
TARGET_PRELINK_MODULE:= false
#LOCAL_C_INCLUDES:=
#LOCAL_STATIC_LIBRARIES:=
# LOCAL_SHARED_LIBRARIES:=
include $(BUILD_SHARED_LIBRARY)
編譯一個動態庫,基本的內容和編譯可執行程式、靜態庫相似,區別在於使用include $(BUILD_ SHARED _LIBRARY)表示編譯靜態庫,本例中LOCAL_MODULE被定義為libtest_ shared,所以最終產生的靜態庫的名稱是libtest_shared.so。
在Android中不需要對C源檔案和C++源檔案進行區分,統一加入LOCAL_SRC_FILES中即可。
可執行程式、靜態庫和動態庫產生的編譯結果分別在一下的目錄中:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY
每個模組的魔錶檔案夾分別為:
l 可執行程式:{XXX}_intermediates
l 靜態庫:{XXX}_static_intermediates
l 動態庫:{XXX}_shared_intermediates
其中{XXX}為每個模組中LOCAL_MODULE所定義的名稱。
在編譯過程中,可以編譯目標及的內容,也可以編譯主機的內容。以上的例子是編譯目標及的內容,可執行程式、動態庫、靜態庫使用宏分別為:
include $(BUILD_EXECUTABLE)
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)
編譯主機的內容,可執行程式、動態庫、靜態庫使用宏分別為:
include $(BUILD_HOST_EXECUTABLE)
include $(BUILD_HOST_SHARED_LIBRARY)
include $(BUILD_HOST_STATIC_LIBRARY)
【轉】Android底層庫和程式