Android系統(tǒng)之Android.mk學(xué)習(xí)總結(jié)
時(shí)間:2020-09-08 01:56:50
手機(jī)看文章
掃描二維碼
隨時(shí)隨地手機(jī)看文章
[導(dǎo)讀]點(diǎn)擊上方嵌入式開發(fā)圈記得關(guān)注我們哦! 1、設(shè)置當(dāng)前模塊的編譯路徑為當(dāng)前文件夾路徑 LOCAL_PATH := $(call my-dir) 2、清理(可能由其他模塊設(shè)置過的)編譯環(huán)境中用到的變量 include $(CLEAR_VARS) 3、模塊編譯變量 變量 用途 LOCAL_SRC_FILES 當(dāng)前模塊包含的源
1、設(shè)置當(dāng)前模塊的編譯路徑為當(dāng)前文件夾路徑
LOCAL_PATH := $(call my-dir)
2、清理(可能由其他模塊設(shè)置過的)編譯環(huán)境中用到的變量
include $(CLEAR_VARS)
3、模塊編譯變量
變量 用途
LOCAL_SRC_FILES 當(dāng)前模塊包含的源代碼文件
LOCAL_MODULE 當(dāng)前模塊的名稱,這個(gè)名稱應(yīng)當(dāng)是唯一的,模塊間的依賴關(guān)系就是通過這個(gè)名稱來引用的
LOCAL_C_INCLUDES C/C++ 語言需要的頭文件的路徑
LOCAL_STATIC_LIBRARIES 當(dāng)前模塊在靜態(tài)編譯時(shí),需要的靜態(tài)庫
LOCAL_SHARED_LIBRARIES 當(dāng)前模塊在運(yùn)行時(shí)依賴的動(dòng)態(tài)庫
LOCAL_CFLAGS C/C++編譯器的參數(shù)
include $(BUILD_EXECUTABLE)
# -I$(LOCAL_C_INCLUDES) 指定頭文件搜索路徑
# -l$(LOCAL_SHARED_LIBRARIES) 指令鏈接的動(dòng)態(tài)庫
gcc $(LOCAL_CFLAGS) $(LOCAL_SRC_FILES) -o $(LOCAL_MODULE) -I$(LOCAL_C_INCLUDES) $(LOCAL_STATIC_LIBRARIES) -l$(LOCAL_SHARED_LIBRARIES)
LOCAL_JAVA_LIBRARIES 當(dāng)前模塊依賴的Java共享庫
LOCAL_STATIC_JAVA_LIBRARIES 當(dāng)前模塊依賴的Java靜態(tài)庫
LOCAL_PACKAGE_NAME 當(dāng)前模塊的APK應(yīng)用的名稱
LOCAL_CERTIFICATE 簽署當(dāng)前應(yīng)用的證書名稱
LOCAL_MODULE_TAGS 當(dāng)前模塊所包含的標(biāo)簽,Android.mk的必選,一個(gè)模塊可以包含多個(gè)標(biāo)簽
標(biāo)簽的值可能是debug, eng, tests, samples 或 optional
build/core/definitions.mk
通常會(huì)用下面函數(shù)獲取上面環(huán)境變量的值:
提供配置編譯需要的函數(shù)
$(call my-dir) 獲取當(dāng)前文件夾路徑
$(call all-subdir-java-files) 獲取當(dāng)前目錄子目錄下所有的java源代碼文件
$(call all-java-files-under, 目錄) 獲取指定目錄下的所有Java文件
$(call all-c-files-under, 目錄) 獲取指定目錄下的所有C語言文件
$(call all-Iaidl-files-under, 目錄) 獲取指定目錄下的所有 AIDL 文件
$(call all-makefiles-under, 目錄) 獲取指定目錄下的所有Make文件
4、模塊類型
BUILD_EXECUTABLE 編譯目標(biāo)機(jī)上的可執(zhí)行文件(ELF)
BUILD_STATIC_LIBRARY 編譯目標(biāo)機(jī)上的靜態(tài)庫(*.a 編譯時(shí)使用)
BUILD_SHARED_LIBRARY 編譯目標(biāo)機(jī)上的動(dòng)態(tài)庫文件(*.so)
BUILD_JAVA_LIBRARY 編譯目標(biāo)機(jī)上的java動(dòng)態(tài)庫
BUILD_STATIC_JAVA_LIBRARY 編譯目標(biāo)機(jī)上的java靜態(tài)庫
BUILD_PACKAGE 編譯目標(biāo)機(jī)上的java包
5、幾個(gè)常見的模板
5.1、編譯可執(zhí)行程序的模板
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)
(菜鳥級(jí)別解釋::=是賦值的意思,$是引用某變量的值)
LOCAL_SRC_FILES中加入源文件路徑,LOCAL_C_INCLUDES 中加入所需要包含的頭文件路徑,
LOCAL_STATIC_LIBRARIES加入所需要鏈接的靜態(tài)庫(*.a)的名稱,
LOCAL_SHARED_LIBRARIES中加入所需要鏈接的動(dòng)態(tài)庫(*.so)的名稱,
LOCAL_MODULE表示模塊最終的名稱,
BUILD_EXECUTABLE表示以一個(gè)可執(zhí)行程序的方式進(jìn)行編譯。
5.2、編譯靜態(tài)庫的模板
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
helloworld.c
LOCAL_MODULE:= libtest_static
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_STATIC_LIBRARY)
一般的和上面相似,BUILD_STATIC_LIBRARY表示編譯一個(gè)靜態(tài)庫。
5.3、編譯動(dòng)態(tài)庫的模板
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
helloworld.c
LOCAL_MODULE:= libtest_shared
TARGET_PRELINK_MODULES := false
#LOCAL_C_INCLUDES :=
#LOCAL_STATIC_LIBRARIES :=
#LOCAL_SHARED_LIBRARIES :=
include $(BUILD_SHARED_LIBRARY)
一般的和上面相似,BUILD_SHARED_LIBRARY表示編譯一個(gè)共享庫。
以上三者的生成結(jié)果分別在如下,generic依具體target會(huì)變:
out/target/product/xxxx/obj/EXECUTABLE
out/target/product/xxxxx/obj/STATIC_LIBRARY
out/target/product/xxxx/obj/SHARED_LIBRARY
每個(gè)模塊的目標(biāo)文件夾分別為:
1.可執(zhí)行程序:XXX_intermediates
2.靜態(tài)庫:XXX_static_intermediates
3.動(dòng)態(tài)庫:XXX_shared_intermediates
5.4、編譯一個(gè)簡單apk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Build all java files in the java subdirectory
LOCAL_SRC_FILES := $(call all-subdir-java-files)
# Name of the APK to build
LOCAL_PACKAGE_NAME := LocalPackage
# Tell it to build an APK
include $(BUILD_PACKAGE)
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場,如有問題,請聯(lián)系我們,謝謝!