注释
# -------------------------------------------------------------
# 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