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 = 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文件相关推荐
- android开发笔记之Makefile(一)
指定编译文件 指定特定的Makefile,你可以使用make的"-f"和"–file"参数,如:make -f Make.Linux或make –file Ma ...
- Android开发笔记(一百四十)Word文件的读取与显示
读取纯文本 现在手机的用途越来越广泛,从原来只有通讯功能的电话,到拍照手机,到上网手机,再到办公手机,可谓是无所不能了.说到办公,除了收发邮件,还有个频繁使用的功能,就是处理word文件.电脑上的of ...
- Android开发笔记(一百一十)使用http框架上传文件
HTTP上传 与文件下载相比,文件上传的场合不是很多,通常用于上传用户头像.朋友圈发布图片/视频动态等等,而且上传文件需要服务器配合,所以容易被app开发者忽略.就上传的形式来说,app一般采用htt ...
- Android开发笔记(七十四)布局文件优化
include/merge 布局优化中常常用到include/merge标签,include的含义类似C代码中的include,意思是直接把指定布局片段包含进当前的布局文件.include适用于多个布 ...
- Android开发笔记(三十四)Excel文件的读写
Android中操作Excel文件的场合较少见,主要是一些专业领域导入导出报表时使用,所以处理Excel读写的开源代码也很稀缺.目前读写Excel主要采用开源库jxl,这个是韩国人写的excel操作工 ...
- Android开发笔记(三十三)文本文件和图片文件的读写
文本文件读写 简单文件读写一般是借助于FileOutputStream和FileInputStream,其中FileOutputStream用于写文件,而FileInputStream用于读文件. 写 ...
- Android开发笔记(三十二)文件基础操作
File类 File类是java中的文件操作工具类,它的常用方法如下: File构造函数 : 根据文件路径构造File对象 delete : 删除文件 exists : 判断文件是否存在 getNam ...
- Android开发笔记(二十五)assets目录下的文件读取
AssetManager工具类 assets目录用于存放应用程序的资产文件,该目录下的文件不会被系统编译,所以无法通过R.*.*这种方式来访问.Android专门为assets目录提供了一个工具类As ...
- Android开发笔记(二十三)文件对话框FileDialog
日期和时间对话框 对话框是人机交互的有力工具,Android自带了几个常用的对话框,包括AlertDialog提示对话框.ProgressDialog进度对话框.DatePickerDialog日期选 ...
最新文章
- Linux初步——常用简单命令
- 转:使用 PHP 直接在共享内存中存储数据集
- html中怎么实现广告自动出来又自动隐藏?,基于jquery实现的定时显示与隐藏div广告的实现代码...
- linux 指令tftp传输文件_Linux tftp 命令用法详解-Linux命令大全(手册)
- SQL存在一个表而不在还有一个表中的数据
- CMOS与BIOS的区别
- 区块链 HyperLedger Fabric安装
- html 文字中不换行怎么写,HTML让字体在一行内显示不换行
- 简单的dp(dp专题)
- 连接打印机错误0x000000bcb解决方法
- win10安装MySQL5.7教程,linux安装MySQL教程,SQLyog安装教程
- 【word论文排版教程2】论文章节安排及分节
- 使用宏将xlsx格式文件批量转为xls格式文件
- Java 服务接入 OpenTracing(2) -- Java 项目快速接入 OpenTracing
- 诸葛:分析师是如何写好数据研究报告的?
- 【分享】pushplus入驻集简云平台,实现无代码集成数百款应用
- [模板] 计算几何2: 自适应Simpson/凸包/半平面交/旋转卡壳/闵可夫斯基和
- 基础技术篇 10 ——物联网常见通信协议与通讯协议梳理【下】- 通信协议
- 【云原生】阿里云容器镜像服务产品ACR EE
- 学生学籍信息管理系统设计c语言,c语言学籍信息管理系统设计
热门文章
- 【js】判断某一天是星期几
- 工业应用中如何选取合适的损失函数(MAE、MSE、Huber)-Pytorch版
- Python系列之案例分析
- qq红心头像[中国心]制作教程之Photoshop教程
- python密码爆破脚本_批量爆破SSH密码 python脚本
- 迎接平价时代,光伏逆变器的行业演进和格局
- 骑手app、配送、外卖送餐、自动接单、进行中、待接单、移动端app、高保真原型、Axure原型、配送里程、结算、取货、送货、送餐订单、外卖平台、送餐小程序、外卖app、点餐平台、移动端骑手app
- python装饰器怎么设置_这个python装饰器怎么了?
- sklearn 混淆矩阵分析pima 印第安人糖尿病数据
- 为什么 CTO 不写代码,还这么牛逼?