Android.mk解析


一、變量說明:

1.LOCAL_PATH:= $(call my-dir)

此行代碼在Android.mk的開頭,用於給出當前文件的路徑

 LOCAL_PATH 用於在開發樹中查找源文件

 宏函數’my-dir’, 由編譯系統提供,用於返回當前路徑(即包含Android.mk file文件的目錄)

 

2.LOCAL_PACKAGE_NAME := SecSettingsLOCAL_MODULE:= SecSettings

標識在Android.mk文件中描述的每個模塊。名稱必須是唯一的且不包含空格。

注意編譯系統會自動產生合適的前綴和后綴:

靜態庫:又稱為文檔文件(Archive File),多個.o文件的集合,linux中靜態庫文件的后綴為“.a”

LOCAL_STATIC_JAVA_LIBRARIES := static-library

LOCAL_STATIC_JAVA_LIBRARIES += libSR

共享庫:多個.o文件的集合,一個被命名為'foo'的共享庫模將會生成'libfoo.so'文件。

        LOCAL_SHARED_LIBRARIES := libBMapApiEngine_v1_3_5

 重要注意事項:如果你把庫命名為‘libhelloworld’,編譯系統將不會添加任何的lib前綴,也會生成libhelloworld.so,這是為了支持來源於Android平台的源代碼的Android.mk文件。如果你確實需要這么做的話。

 

3.LOCAL_MODULE_TAGS := optional / user / eng / tests  可選定義

 該模塊在所有版本下都編譯/ 該模塊只在user版本下才編譯/ 該模塊只在eng版本下才編譯/ 該模塊只在tests版本下才編譯

 

 4.LOCAL_OVERRIDES_PACKAGES := Settings

 覆蓋其他所有同名的應用

 

5.LOCAL_CERTIFICATE := platform 可選定義

編譯一個需要platform簽名的APK,而不是share編譯

 

6.LOCAL_PROGUARD_FLAG_FILES := proguard.flags

指定不需要混淆的native方法與變量的proguard.flags文件

ProGuard的主要作用就是混淆:Java的字節碼一般是非常容易反編譯的。為了很好的保護Java源代碼,我們往往會對編譯好的class文件進行混淆處理。

 

7.LOCAL_PROGUARD_ENABLED:= disabled

制定編譯的工程,不要使用代碼混淆的工具進行代碼混淆:

 

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 必須包含將要編譯打包進模塊中的源代碼文件

不用在這里列出頭文件和包含文件,因為編譯系統將會自動為你找出依賴型的文件;僅僅列出直接傳遞給編譯器的源代碼文件就好

 

10.LOCAL_RESOURCE_OVERLAY_DIR := $(LOCAL_PATH)/TN_CHN_OPEN/res

指定資源文件路徑

11.LOCAL_AAPT_FLAGS := $(SEC_DEV_APP_LOCAL_AAPT_FLAGS)

指定打包資源文件

因為Android的工具aapt在生成apk文件時默認地會編譯並壓縮res/下的文件,而一些系統文件則不需要被壓縮(否則在讀取該文件時需要解壓縮),在Android.mk文件需要指定以下選項告訴aapt工具不壓縮所的文件。

例如Android.mk文件需要指定以下選項告訴aapt工具不壓縮所有.dat文件:

LOCAL_AAPT_FLAGS := -0 .dat

 

二、語句解釋

1.include $(CLEAR_VARS)

CLEAR_VARS由編譯系統提供(可以在 android 安裝目錄下的/build/core/config.mk 文件看到其定義,為 CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mk),因為所有的編譯控制文件都在同一個GNU MAKE執行環境中,所有的變量都是全局的,讓GNU MAKEFILE清除許多LOCAL_XXX變量,例如 :LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES,  等等...

該語句的意思就是把CLEAR_VARS變量所指向的腳本文件包含進來。

 

2. include $(BUILD_PACKAGE)

指定編譯生成APK

3.include $(BUILD_STATIC_LIBRARY)

用於編譯一個靜態庫,將會生成一個名為lib$(LOCAL_MODULE).a的文件

靜態庫不會復制到的APK包中,但是能夠用於編譯共享庫。

4.include $(BUILD_SHARED_LIBRARY)

 指向編譯腳本,根據所有的在 LOCAL_XXX 變量把列出的源代碼文件編譯成一個共享庫,將生成一個名為lib$(LOCAL_MODULE).so的文件

注意:你必須至少在包含這個文件之前定義LOCAL_MODULE和LOCAL_SRC_FILES

 

5.$(info RES_OVERLAY TN_CHN_OPEN/RES/)

相當於代碼中的log信息

 

6.ifneq($(filter santos10%,$(TARGET_PRODUCT)),)

##############################################

endif

判斷是否含有santos10***的string,有的話,進入ifneq條件

Filter有兩個參數

 

7..ifneq($(filter %wifi,$(PROJECT_NAME)))

###############################################

endif

判斷是否含有***wifi,如果有進入ifneq條件

8.  +=

原來有的話不覆蓋

9.=

之前的值清空,重新復制

 

10.LOCAL_RESOURCE_OVERLAY_DIR:=$(LOCAL_PAHT)/TN_CHN_OPEN/res $(LOCAL_RESOURCE_OVERLAY_DIR)

相當於

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,進入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 地區是不是CHN,如果是,進入ifeq條件

SettingsAndroid.mk 的相關介紹

1.地區宏: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.運營商宏: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)

控制雙卡相關文件路徑為:TN_MultiSIM/…

ifeq (true,$(call spf_check,SEC_PRODUCT_FEATURE_COMMON_DSDS_SUPPORT,TRUE))

控制雙卡相關文件路徑為:TN_DSDS/…

 

上面三個宏的定義路徑:

//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.項目名控制:TARGET_PRODUCT

ifneq ($(filter wilcoxds%, $(TARGET_PRODUCT)),)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM