android开发笔记之mk文件

这里写图片描述

注释

# -------------------------------------------------------------
#                     START
# -------------------------------------------------------------

自定义变量

以下是在 Android.mk中依赖或定义的变量列表,可以定义其他变量为自己使用,但是NDK编译系统保留下列变量名:
-以 LOCAL_开头的名字(例如 LOCAL_MODULE)
-以 PRIVATE_, NDK_ 或 APP_开头的名字(内部使用)
-小写名字(内部使用,例如‘my-dir’)
如果为了方便在 Android.mk 中定义自己的变量,建议使用 MY_前缀,一个小例子:

MY_SOURCES := foo.c 
ifneq ($(MY_CONFIG_BAR),) 
MY_SOURCES += bar.c 
endif 
LOCAL_SRC_FILES += $(MY_SOURCES) 

注意:
‘:=’是赋值的意思;’+=’是追加的意思;‘$’表示引用某变量的值

文件复制-PRODUCT_COPY_FILES

PRODUCT_COPY_FILES += device/qcom/l9010_mmx/media/media_profiles_8916.xml:system/etc/media_profiles.xml \
device/qcom/l9010_mmx/media/media_codecs_8939.xml:system/etc/media_codecs_8939.xml \
device/qcom/l9010_mmx/media/media_codecs_8929.xml:system/etc/media_codecs_8929.xml

这个命令是对launcher应用app布局文件的定义:

PRODUCT_COPY_FILES += vendor/tinno/packages/apks/default_workspace.xml:system/etc/default_workspace.xml

定义包-PRODUCT_PACKAGES

PRODUCT_PACKAGES += \
    ConfigUpdater \
    GoogleBackupTransport \
    GoogleFeedback \
    GoogleLoginService \
    GoogleOneTimeInitializer \
    GooglePartnerSetup \
    GoogleServicesFramework \
    GoogleCalendarSyncAdapter \
    GoogleContactsSyncAdapter \
    GmsCore \
    Phonesky \
    SetupWizard

strip 去空格函数

$(strip string)

功能:去掉字串中开头和结尾的空字符。
返回:返回被去掉空格的字符串值。
示例

TEST = DEFAULT 
RESULT            = no

ifeq ($(strip $(TEST)), DEFAULT)
    RESULT = yes
endif

ifeq ifneq ifdef ifndef–条件判断

ifeq ifneq

如果定义TINNO_LANIX_DATACON_ALERT为true,就内置LanixDataconAlert

TINNO_LANIX_DATACON_ALERT := true
ifeq ($(strip $(TINNO_LANIX_DATACON_ALERT)),true)
  PRODUCT_PACKAGES += LanixDataconAlert 
endif

如果定义PRODUCT_PREBUILT_WEBVIEWCHROMIUM为yes,就包含vendor/google/gms/apps/WebViewGoogle/overlay。

PRODUCT_PREBUILT_WEBVIEWCHROMIUM := yes
ifeq ($(PRODUCT_PREBUILT_WEBVIEWCHROMIUM),yes)
PRODUCT_PACKAGES += WebViewGoogle
# The following framework overlay must be included if prebuilt WebViewGoogle.apk is used
PRODUCT_PACKAGE_OVERLAYS += vendor/google/gms/apps/WebViewGoogle/overlay
endif

如果为eng版本就不内置SetupWizard,如果不为eng就内置SetupWizard。

ifeq ($(strip $(TARGET_BUILD_VARIANT)),eng)
#$(warning ----eng---no--need---setupwizard----)
else
PRODUCT_PACKAGES += \
    SetupWizard
endif

如果TARGET_USES_QTIC为空,就将TARGET_USES_QTIC置为true

 ifeq ($(strip $(TARGET_USES_QTIC)),)
 TARGET_USES_QTIC := true
 endif

如果PROJECT_NAME不为空,就复制对应vendor/tinno/ (TARGETPRODUCT)/ (PROJECT_NAME)/copy_custom_files文件,如果PROJECT_NAME为空,就对应复制vendor/tinno/$(TARGET_PRODUCT)/trunk/copy_custom_files文件

#wangyanhui add for custom copy_files 
ifneq ($(strip $(PROJECT_NAME)),)
COPY_FILES_PATH := vendor/tinno/$(TARGET_PRODUCT)/$(PROJECT_NAME)/copy_custom_files
$(shell cp -rf  $(COPY_FILES_PATH)/*   .)
else
COPY_FILES_PATH := vendor/tinno/$(TARGET_PRODUCT)/trunk/copy_custom_files
$(shell cp -rf  $(COPY_FILES_PATH)/*   .)
endif
#copy_files end

findstring

findstring string_a, string_Src

功能:从string_Src中查找string_a
返回:如果查找到string_a,返回string_a,如果没有查找到,返回

样例

WIKO_SOUND_VERSION:=wiko_sound_1_3

ifneq ($(strip $(WIKO_SOUND_VERSION)),)
$(warning $(WIKO_SOUND_VERSION))
ifeq ($(findstring _1_0, $(strip $(WIKO_SOUND_VERSION))),_1_0)

else ifeq ($(findstring _1_1, $(strip $(WIKO_SOUND_VERSION))),_1_1)
findstring 7731g,$(CONFIGURE_SRC)

ifdef ifndef

*.c文件中定义:

#ifndef WIFI_SDIO_IF_DRIVER_MODULE_PATH
#define WIFI_SDIO_IF_DRIVER_MODULE_PATH "/system/lib/modules/librasdioif.ko"
#endif

在mk文件中:

ifdef WIFI_DRIVER_MODULE_PATH
LOCAL_CFLAGS += -DWIFI_DRIVER_MODULE_PATH=\"$(WIFI_DRIVER_MODULE_PATH)\"
endif

TARGET_BUILD_VARIANT编译类型(user ,userdebug,eng)

user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT))
enable_target_debugging := true
tags_to_install :=
ifneq (,$(user_variant))
  # Target is secure in user builds.
  ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1
  ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1

  ifeq ($(user_variant),user)
    ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1
  endif

  ifeq ($(user_variant),userdebug)
    # Pick up some extra useful tools
    tags_to_install += debug
  else
    # Disable debugging in plain user builds.
    enable_target_debugging :=
  endif

all-subdir-makefiles

include $(call all-subdir-makefiles)

返回一个位于当前’my-dir’路径的子目录列表。
例如,看下面的目录层次:
sources/foo/Android.mk
sources/foo/lib1/Android.mk
sources/foo/lib2/Android.mk
如果sources/foo/Android.mk包含一行:

include $(call all-subdir-makefiles)

那么它就会自动包含sources/foo/lib1/Android.mk 和sources/foo/lib2/Android.mk
这项功能用于向编译系统提供深层次嵌套的代码目录层次。
注意:在默认情况下,NDK将会只搜索在sources/*/Android.mk中的文件。

导入Android.mk文件

include $(LOCAL_PATH)/models/Android.mk

LOCAL_PATH := $(call my-dir)

每个Android.mk文件必须以定义LOCAL_PATH为开始。它用于在开发tree中查找源文件。
宏my-dir 则由Build System提供。
返回包含Android.mk的目录路径,这个路径非常有用。

include $(CLEAR_VARS)

CLEAR_VARS 变量由Build System提供。并指向一个指定的GNU Makefile,由它负责清理很多LOCAL_xxx.
例如:LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES等等。但不清理LOCAL_PATH.
这个清理动作是必须的,因为所有的编译控制文件由同一个GNU Make解析和执行,其变量是全局的。所以清理后才能避免相互影响。

TARGET_OUT

TARGET_OUT相当于out/target/product/l9010_blu

使用shell命令:

$(shell mkdir -p $(TARGET_OUT)/pre-install/CleanMaster_5.8.0/)
$(shell cp -af $(LOCAL_PATH)/CleanMaster_5.8.0.apk $(TARGET_OUT)/pre-install/CleanMaster_5.8.0/CleanMaster_5.8.0.apk)

mkdir的-p选项允许你一次性创建多层次的目录,而不是一次只创建单独的目录。
cp –af 源文件所在目录 放置文件夹

复制文件来覆盖对应的文件

#cp custom files
$(shell cp -af  device/qcom/l9010_cla/custom_files/bdroid_buildcfg.h  device/qcom/l9010_cla/bdroid_buildcfg.h )
$(shell cp -af  device/qcom/l9010_cla/custom_files/buildinfo.sh   build/tools/buildinfo.sh   )
$(shell cp -af  device/qcom/l9010_cla/custom_files/external/sepolicy/keys.conf  external/sepolicy/keys.conf)

内置一个priv_app的应用

定义此app:

amazon_appstore := true
ifeq ($(amazon_appstore), true)
include $(CLEAR_VARS)
LOCAL_MODULE := AmazonApps-release_v16.0000.887.13C
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_PRIVILEGED_MODULE := true
include $(BUILD_PREBUILT)
endif

将其内置进去:

PRODUCT_COPY_FILES += vendor/tinno/blu/3rd_app/amazon_appstore/amzn.apps.ref:system/etc/amzn.apps.ref
PRODUCT_COPY_FILES += vendor/tinno/blu/3rd_app/amazon_appstore/liblatency.so:system/lib/liblatency.so
PRODUCT_PACKAGES += \
    AmazonApps-release_v16.0000.887.13C \

call —声明一个mk文件

声明mk文件,把mk中的变量添加进来

TN_BOOTANIMATION_RES := true
ifeq ($(TN_BOOTANIMATION_RES), true)
$(call inherit-product, device/qcom/l9010_blu/res/shutdown/shut.mk)
$(call inherit-product, device/qcom/l9010_blu/res/animation/animation.mk)
endif
$(call inherit-product-if-exists, vendor/tinno/blu/gms.mk)
$(call inherit-product-if-exists, vendor/tinno/blu/blu.mk)

PRODUCT_PROPERTY_OVERRIDES

PRODUCT_PROPERTY_OVERRIDES–系统属性值的覆盖:

PRODUCT_PROPERTY_OVERRIDES += \
       dalvik.vm.heapgrowthlimit=128m \
       dalvik.vm.heapminfree=6m \
       dalvik.vm.heapstartsize=14m

用当前app替换Gallery2

LOCAL_OVERRIDES_PACKAGES := Gallery2

Settings应用的名字,platform签名,内置为private

LOCAL_PACKAGE_NAME := Settings
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true

LOCAL_PACKAGE_NAME := Settings
app应用的名称

LOCAL_CERTIFICATE := platform
代表使用platform来签名,这样的话这个apk就拥有了和system相同的签名,这需要在androidmanifest.xml文件中添加android:sharedUserId=”android.uid.system”,使得apk有system权限。

LOCAL_PRIVILEGED_MODULE := true
app应用在目录/system/priv-app/下

LOCAL_PRIVILEGED_MODULE := false
app应用在目录/system/app/下

复制内置apk中的so文件:

LOCAL_PREBUILT_JNI_LIBS:= \
         @lib/armeabi/libnativeU.so

LOCAL_PREBUILT_JNI_LIBS := \
    @lib/$(my_src_abi)/libbitmap_parcel.so \
    @lib/$(my_src_abi)/libdocscanner_image.so \
    @lib/$(my_src_abi)/libdocsimageutils.so \
    @lib/$(my_src_abi)/libfileutils.so \
    @lib/$(my_src_abi)/libfoxit.so \
    @lib/$(my_src_abi)/librectifier.so \
    @lib/$(my_src_abi)/libwebp_android.so

输出信息

error输出信息

$(error string)
在Makefile或mk文件中,有这样一行语句:

ifeq ($(build_ota_package),true)
OTATOOLS :=  $(HOST_OUT_EXECUTABLES)/minigzip \

我想查看编译时build_ota_package的值是true还是false,我们添加:

$(error  " hexiaoming   $(build_ota_package)")
ifeq ($(build_ota_package),true)

编译时报错,停止,并且输出报错信息:

build/core/Makefile:1516: *** " hexiaoming   true".

那么我们知道,build_ota_package变量为true

还如:

$(error "$(ANDROID_JACK_DEFAULT_VERSION)" is an invalid value for ANDROID_JACK_DEFAULT_VERSION)

warning 和 info

打印输出信息的方法还有: (warningstring) (info string)

出变量方式为: (warning (var))

$(warning 'hehe fuck')  
$(warning $(LOCAL_SRC_FILES),$(LOCAL_PATH))  
$(warning $(all-subdir-makefiles),$(this.makefile))  
$(warning $(TARGET_ARCH))  
$(info erroinfo,hehe)  

filter 和 filter-out

filter

$(filter word1 word2,$(VARIANTS))

判断变量VARIANTS中是否包含word1和 word2,如果包含就把VARIANTS中包含的word1和word2之外的过滤掉

示例:

VARIANTS := mon tue wed thu fri sat sun
DAY := $(filter sat sun,$(VARIANTS))
$(info $(DAY))

输出结果为:

sat sun

filter-out

$(filter-out word1 word2,$(VARIANTS))

判断变量VARIANTS中是否包含word1和 word2,如果包含就把VARIANTS中包含的word1和word2过滤掉,其余的全部保留

示例:

VARIANTS := mon tue wed thu fri sat sun
DAY := $(filter-out sat sun,$(VARIANTS))
$(info $(DAY))

输出结果为:

mon tue wed thu fri

TARGET_PRODUCT

TARGET_PRODUCT值为对应编译项目的选择,就是lunch时选择的项目

TARGET_BUILD_VARIANT

TARGET_BUILD_VARIANT值对应项目的选择编译类型,就是lunch时选择项目的编译类型,如user,userdebug,eng

PLATFORM平台

芯片平台,是MTK,还是QCOM

ifneq ( (strip (PLATFORM)), QCOM)
PRODUCT_PACKAGES += XXX
endif

你可能感兴趣的:(android开发笔记,android开发笔记)