Android.mk解析
一、變量說明:
1.LOCAL_PATH:= $(call my-dir)
此行代碼在Android.mk的開頭,用于給出當(dāng)前文件的路徑
?LOCAL_PATH 用于在開發(fā)樹中查找源文件
?宏函數(shù)’my-dir’, 由編譯系統(tǒng)提供,用于返回當(dāng)前路徑(即包含Android.mk file文件的目錄)
?
2.LOCAL_PACKAGE_NAME?:= SecSettings?或?LOCAL_MODULE:= SecSettings
標(biāo)識在Android.mk文件中描述的每個(gè)模塊。名稱必須是唯一的且不包含空格。
注意編譯系統(tǒng)會自動產(chǎn)生合適的前綴和后綴:
靜態(tài)庫:又稱為文檔文件(Archive File),多個(gè).o文件的集合,linux中靜態(tài)庫文件的后綴為“.a”
LOCAL_STATIC_JAVA_LIBRARIES?:=?static-library
LOCAL_STATIC_JAVA_LIBRARIES += libSR
共享庫:多個(gè).o文件的集合,一個(gè)被命名為'foo'的共享庫模將會生成'libfoo.so'文件。
??????? LOCAL_SHARED_LIBRARIES := libBMapApiEngine_v1_3_5
?重要注意事項(xiàng):如果你把庫命名為‘libhelloworld’,編譯系統(tǒng)將不會添加任何的lib前綴,也會生成libhelloworld.so,這是為了支持來源于Android平臺的源代碼的Android.mk文件。如果你確實(shí)需要這么做的話。
?
3.LOCAL_MODULE_TAGS?:= optional / user / eng / tests??可選定義
?該模塊在所有版本下都編譯/ 該模塊只在user版本下才編譯/ 該模塊只在eng版本下才編譯/ 該模塊只在tests版本下才編譯
?
?4.LOCAL_OVERRIDES_PACKAGES?:= Settings
?覆蓋其他所有同名的應(yīng)用
?
5.LOCAL_CERTIFICATE?:= platform?可選定義
編譯一個(gè)需要platform簽名的APK,而不是share編譯
?
6.LOCAL_PROGUARD_FLAG_FILES?:= proguard.flags
指定不需要混淆的native方法與變量的proguard.flags文件
ProGuard的主要作用就是混淆:Java的字節(jié)碼一般是非常容易反編譯的。為了很好的保護(hù)Java源代碼,我們往往會對編譯好的class文件進(jìn)行混淆處理。
?
7.LOCAL_PROGUARD_ENABLED:= disabled
制定編譯的工程,不要使用代碼混淆的工具進(jìn)行代碼混淆:
?
8.LOCAL_CLASSPATH := $(LOCAL_PATH)/lib/maps.jar
?
9.LOCAL_SRC_FILES?:= $(call all-java-files-under, src)
LOCAL_SRC_FILES += src/com/android/settings/nearby/IMediaServer.aidl
變量 LOCAL_SRC_FILES 必須包含將要編譯打包進(jìn)模塊中的源代碼文件
不用在這里列出頭文件和包含文件,因?yàn)榫幾g系統(tǒng)將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好
?
10.LOCAL_RESOURCE_OVERLAY_DIR?:= $(LOCAL_PATH)/TN_CHN_OPEN/res
指定資源文件路徑
11.LOCAL_AAPT_FLAGS?:= $(SEC_DEV_APP_LOCAL_AAPT_FLAGS)
指定打包資源文件
因?yàn)锳ndroid的工具aapt在生成apk文件時(shí)默認(rèn)地會編譯并壓縮res/下的文件,而一些系統(tǒng)文件則不需要被壓縮(否則在讀取該文件時(shí)需要解壓縮),在Android.mk文件需要指定以下選項(xiàng)告訴aapt工具不壓縮所的文件。
例如Android.mk文件需要指定以下選項(xiàng)告訴aapt工具不壓縮所有.dat文件:
LOCAL_AAPT_FLAGS := -0 .dat
?
二、語句解釋
1.include $(CLEAR_VARS)
CLEAR_VARS由編譯系統(tǒng)提供(可以在 android 安裝目錄下的/build/core/config.mk?文件看到其定義,為 CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),因?yàn)樗械木幾g控制文件都在同一個(gè)GNU MAKE執(zhí)行環(huán)境中,所有的變量都是全局的,讓GNU MAKEFILE清除許多LOCAL_XXX變量,例如?:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES,??等等...
該語句的意思就是把CLEAR_VARS變量所指向的腳本文件包含進(jìn)來。
?
2.?include?$(BUILD_PACKAGE)
指定編譯生成APK
3.include $(BUILD_STATIC_LIBRARY)
用于編譯一個(gè)靜態(tài)庫,將會生成一個(gè)名為lib$(LOCAL_MODULE).a的文件
靜態(tài)庫不會復(fù)制到的APK包中,但是能夠用于編譯共享庫。
4.include $(BUILD_SHARED_LIBRARY)
?指向編譯腳本,根據(jù)所有的在 LOCAL_XXX 變量把列出的源代碼文件編譯成一個(gè)共享庫,將生成一個(gè)名為lib$(LOCAL_MODULE).so的文件
注意:你必須至少在包含這個(gè)文件之前定義LOCAL_MODULE和LOCAL_SRC_FILES
?
5.$(info RES_OVERLAY TN_CHN_OPEN/RES/)
相當(dāng)于代碼中的log信息
?
6.ifneq($(filter santos10%,$(TARGET_PRODUCT)),)
##############################################
endif
判斷是否含有santos10***的string,有的話,進(jìn)入ifneq條件
Filter有兩個(gè)參數(shù)
?
7..ifneq($(filter %wifi,$(PROJECT_NAME)),)
###############################################
endif
判斷是否含有***wifi,如果有進(jìn)入ifneq條件
8.? +=
原來有的話不覆蓋
9.:=
之前的值清空,重新復(fù)制
?
10.LOCAL_RESOURCE_OVERLAY_DIR:=$(LOCAL_PAHT)/TN_CHN_OPEN/res $(LOCAL_RESOURCE_OVERLAY_DIR)
相當(dāng)于
LOCAL_RESOURCE_OVERLAY_DIR??:=? $(LOCAL_PAHT)/TN_CHN_OPEN/res
LOCAL_RESOURCE_OVERLAY_DIR? +=? LOCAL_RESOURCE_OVERLAY_DIR(原來的)
?
11.ifeq($(findstring santos3g,$(PROJECT_NAME)),cantos3g)
###################################################
endif
如果PROJECT_NAME中含有santos3g,進(jìn)入ifeq條件
?
?
?如何查找PROJECT_NAME與TARGET_PRODUCT的值
1.到編譯log中搜索,即可得到
2.到腳本中查找,
./buildscript/build中
export PROJECT_NAME=${_BUILD_PROJECT_NAME%%_*}
而_BUILD_PROJECT_NAME就是$1
我們的輸入如果是santos103g_chn_open那么PROJECT_NAME=santos103g
12. ifeq (true,$(call spf_check, EC_PRODUCT_FEATURE_TEMP_REGION,CHN))
Check 地區(qū)是不是CHN,如果是,進(jìn)入ifeq條件
三、Settings的Android.mk?的相關(guān)介紹
1.地區(qū)宏:SEC_PRODUCT_FEATURE_TEMP_REGION?
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_REGION,HKTW))
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_REGION,CHN))
2.運(yùn)營商宏:SEC_PRODUCT_FEATURE_TEMP_OPERATOR
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_OPERATOR,CMCC))
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_TEMP_OPERATOR,CTC))
3.雙卡宏:BUILD_MULTISIM_PROJECT
??????? SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT
ifeq ($(BUILD_MULTISIM_PROJECT),true)
控制雙卡相關(guān)文件路徑為:TN_MultiSIM/…
ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT,TRUE))
控制雙卡相關(guān)文件路徑為:TN_DSDS/…
?
上面三個(gè)宏的定義路徑:
//JBP_MAIN/Maple/JBP98x/model/vendor/wilcoxds/SecProductFeature.wilcoxdszn
OpenGrok/android/vendor/samsung/wilcoxds/SecProductFeature.wilcoxdszn
# Region, Operator feature
SEC_PRODUCT_FEATURE_TEMP_REGION="CHN"
SEC_PRODUCT_FEATURE_TEMP_OPERATOR="CU"
#Common DSDS Feature
SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT=TRUE
# another micro for multisim module
SEC_PRODUCT_FEATURE_COMMON_USE_MULTISIM=TRUE
?
4.平臺控制宏:?BUILD_RIL_MARVELL_RIL
ifeq ($(BUILD_RIL_MARVELL_RIL), true)
5.項(xiàng)目名控制:TARGET_PRODUCT
ifneq ($(filter wilcoxds%, $(TARGET_PRODUCT)),)
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀
總結(jié)
以上是生活随笔為你收集整理的Android.mk解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android N Display Si
- 下一篇: 高通QXDM抓modem log