注释

# -------------------------------------------------------------
#                     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            = noifeq ($(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 := trueendif

如果PROJECT_NAME不为空,就复制对应vendor/tinno/(TARGETPRODUCT)/(TARGET_PRODUCT)/(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_3ifneq ($(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=1ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1ifeq ($(user_variant),user)ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1endififeq ($(user_variant),userdebug)# Pick up some extra useful toolstags_to_install += debugelse# 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)或者(warning string)或者 (info string)

出变量方式为:(warning(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(strip (PLATFORM)), QCOM)
PRODUCT_PACKAGES += XXX
endif

android开发笔记之mk文件相关推荐

  1. android开发笔记之Makefile(一)

    指定编译文件 指定特定的Makefile,你可以使用make的"-f"和"–file"参数,如:make -f Make.Linux或make –file Ma ...

  2. Android开发笔记(一百四十)Word文件的读取与显示

    读取纯文本 现在手机的用途越来越广泛,从原来只有通讯功能的电话,到拍照手机,到上网手机,再到办公手机,可谓是无所不能了.说到办公,除了收发邮件,还有个频繁使用的功能,就是处理word文件.电脑上的of ...

  3. Android开发笔记(一百一十)使用http框架上传文件

    HTTP上传 与文件下载相比,文件上传的场合不是很多,通常用于上传用户头像.朋友圈发布图片/视频动态等等,而且上传文件需要服务器配合,所以容易被app开发者忽略.就上传的形式来说,app一般采用htt ...

  4. Android开发笔记(七十四)布局文件优化

    include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件.include适用于多个布 ...

  5. Android开发笔记(三十四)Excel文件的读写

    Android中操作Excel文件的场合较少见,主要是一些专业领域导入导出报表时使用,所以处理Excel读写的开源代码也很稀缺.目前读写Excel主要采用开源库jxl,这个是韩国人写的excel操作工 ...

  6. Android开发笔记(三十三)文本文件和图片文件的读写

    文本文件读写 简单文件读写一般是借助于FileOutputStream和FileInputStream,其中FileOutputStream用于写文件,而FileInputStream用于读文件. 写 ...

  7. Android开发笔记(三十二)文件基础操作

    File类 File类是java中的文件操作工具类,它的常用方法如下: File构造函数 : 根据文件路径构造File对象 delete : 删除文件 exists : 判断文件是否存在 getNam ...

  8. Android开发笔记(二十五)assets目录下的文件读取

    AssetManager工具类 assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问.Android专门为assets目录提供了一个工具类As ...

  9. Android开发笔记(二十三)文件对话框FileDialog

    日期和时间对话框 对话框是人机交互的有力工具,Android自带了几个常用的对话框,包括AlertDialog提示对话框.ProgressDialog进度对话框.DatePickerDialog日期选 ...

最新文章

  1. Linux初步——常用简单命令
  2. 转:使用 PHP 直接在共享内存中存储数据集
  3. html中怎么实现广告自动出来又自动隐藏?,基于jquery实现的定时显示与隐藏div广告的实现代码...
  4. linux 指令tftp传输文件_Linux tftp 命令用法详解-Linux命令大全(手册)
  5. SQL存在一个表而不在还有一个表中的数据
  6. CMOS与BIOS的区别
  7. 区块链 HyperLedger Fabric安装
  8. html 文字中不换行怎么写,HTML让字体在一行内显示不换行
  9. 简单的dp(dp专题)
  10. 连接打印机错误0x000000bcb解决方法
  11. win10安装MySQL5.7教程,linux安装MySQL教程,SQLyog安装教程
  12. 【word论文排版教程2】论文章节安排及分节
  13. 使用宏将xlsx格式文件批量转为xls格式文件
  14. Java 服务接入 OpenTracing(2) -- Java 项目快速接入 OpenTracing
  15. 诸葛:分析师是如何写好数据研究报告的?
  16. 【分享】pushplus入驻集简云平台,实现无代码集成数百款应用
  17. [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
  18. 基础技术篇 10 ——物联网常见通信协议与通讯协议梳理【下】- 通信协议
  19. 【云原生】阿里云容器镜像服务产品ACR EE
  20. 学生学籍信息管理系统设计c语言,c语言学籍信息管理系统设计

热门文章

  1. 【js】判断某一天是星期几
  2. 工业应用中如何选取合适的损失函数(MAE、MSE、Huber)-Pytorch版
  3. Python系列之案例分析
  4. qq红心头像[中国心]制作教程之Photoshop教程
  5. python密码爆破脚本_批量爆破SSH密码 python脚本
  6. 迎接平价时代,光伏逆变器的行业演进和格局
  7. 骑手app、配送、外卖送餐、自动接单、进行中、待接单、移动端app、高保真原型、Axure原型、配送里程、结算、取货、送货、送餐订单、外卖平台、送餐小程序、外卖app、点餐平台、移动端骑手app
  8. python装饰器怎么设置_这个python装饰器怎么了?
  9. sklearn 混淆矩阵分析pima 印第安人糖尿病数据
  10. 为什么 CTO 不写代码,还这么牛逼?