Android.mk(makefile)中几个符号的区别:=、 :=、 ?=、 +=

简介: 本文解释了在Android.mk文件中使用的几种赋值符号的区别,包括`=`(基本赋值)、`:=`(覆盖赋值)、`?=`(条件赋值,仅在变量未赋值时操作)、`+=`(追加赋值),并通过实验演示了这些符号的具体行为和效果。

一、篇头

  • Android.mk也是需要通过make程序去解释执行,语法同Makefile文件
  • Andorid AOSP代码中,依旧还有大量地方在使用mk文件,今日遇上,概念混淆,记录一下

二、结论

 = 是最基本的赋值,左边变量赋予右边的值,直接覆盖
:= 是覆盖之前的值,不论是用什么符号赋的值
?= 是如果没有被赋值过就赋予等号后面的值,如果之前有赋值,就跳过
+= 是添加等号后面的值,这个比较常用,追加值和属性

三、实验 1

3.1 makefile

  • 新建一个makefile文件,填入如下内容
#1. 如果定义了DEFINE_VRE=true
ifdef DEFINE_VRE
    VRE = “Hello World!else
#如果没有定义DEFINE_VRE,则什么也不做
endif

#2. 如果OPT变量等于“define”
ifeq ($(OPT),define)
    VRE ?= “Hello World! First!”
endif

#3. 如果OPT变量等于“add”
ifeq ($(OPT),add)
    VRE += “Kelly!”
endif

#4. 如果OPT变量等于“recover”
ifeq ($(OPT),recover)
    VRE := “Hello World! Again!”
endif

#5. 打印 $(VRE) 的值”
all:
    @echo $(VRE)

3.2 执行结果

敲入以下make命令:
make DEFINE_VRE=true OPT=define 输出:Hello World!
解释:走了1,2,5的流程,第2项使用的是 ?=, 因DEFINE_VRE已经被定义赋值过,所以值不变,还是1的VRE = “Hello World!make DEFINE_VRE=true OPT=add 输出:Hello World! Kelly!
解释:走了1,3,5的流程,第3项使用的是 += , 所以在第1项目的基础上,加入了字符串 “Kelly!”

以此类推:
make DEFINE_VRE=true OPT=recover  输出:Hello World! Again!
make DEFINE_VRE= OPT=define 输出:Hello World! First!
make DEFINE_VRE= OPT=add 输出:Kelly!
make DEFINE_VRE= OPT=recover 输出:Hello World! Again!

四、实验 2

4.1 Android.mk

• 例子:给$PARTITION_FILE_LIST追加值

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := Reserve0.img
LOCAL_MODULE_CLASS:= ETC
LOCAL_MODULE_PATH := $(PRODUCT_OUT)

PARTITION_SIZE_M := 16
PARTITION_FILE_LIST ?= \
    vendor/aw/homlet/tvsystem/tvserver/1.0/default/configs/panel_config/panel_config.ini

PARTITION_FILE_LIST += $(LOCAL_PATH)/advert.bmp

$(info 11111111111111111111111111111111111111111111111111111)
$(info $(PARTITION_FILE_LIST))
$(info 22222222222222222222222222222222222222222222222222222)

GEN := $(local-generated-sources-dir)/$(LOCAL_MODULE)

$(GEN): $(LOCAL_PATH)/gen.sh $(PARTITION_FILE_LIST)
    $< $@ $(PARTITION_SIZE_M) "$(PARTITION_FILE_LIST)"

LOCAL_PREBUILT_MODULE_FILE := $(GEN)

include $(BUILD_PREBUILT)

4.2 执行结果

============================================
device/softwinner/ares/Reserve0/Android.mk was modified, regenerating...
[ 10% 28/258] including device/softwinner/ares/Reserve0/Android.mk ...
11111111111111111111111111111111111111111111111111111
device/softwinner/ares/h713-tuna_perf1/panel_config/panel_config.ini device/softwinner/ares/Reserve0/advert.bmp
22222222222222222222222222222222222222222222222222222
[ 12% 31/258] including device/softwinner/common/config/wireless/Android.mk ...
相关文章
|
2月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
**Kotlin中的`by lazy`和`lateinit`都是延迟初始化技术。`by lazy`用于只读属性,线程安全,首次访问时初始化;`lateinit`用于可变属性,需手动初始化,非线程安全。`by lazy`支持线程安全模式选择,而`lateinit`适用于构造函数后初始化。选择依赖于属性特性和使用场景。**
93 5
Android经典面试题之Kotlin延迟初始化的by lazy和lateinit有什么区别?
|
2月前
|
Android开发 开发者
Android经典面试题之SurfaceView和TextureView有什么区别?
分享了`SurfaceView`和`TextureView`在Android中的角色。`SurfaceView`适于视频/游戏,独立窗口低延迟,但变换受限;`TextureView`支持复杂变换,视图层级中渲染,适合动画/视频特效,但性能略低。两者在性能、变换、使用和层级上有差异,开发者需按需选择。
43 1
|
2月前
|
SQL Java Unix
Android经典面试题之Java中获取时间戳的方式有哪些?有什么区别?
在Java中获取时间戳有多种方式,包括`System.currentTimeMillis()`(毫秒级,适用于日志和计时)、`System.nanoTime()`(纳秒级,高精度计时)、`Instant.now().toEpochMilli()`(毫秒级,ISO-8601标准)和`Instant.now().getEpochSecond()`(秒级)。`Timestamp.valueOf(LocalDateTime.now()).getTime()`适用于数据库操作。选择方法取决于精度、用途和时间起点的需求。
39 3
|
2月前
|
消息中间件 调度 Android开发
Android经典面试题之View的post方法和Handler的post方法有什么区别?
本文对比了Android开发中`View.post`与`Handler.post`的使用。`View.post`将任务加入视图关联的消息队列,在视图布局后执行,适合视图操作。`Handler.post`更通用,可调度至特定Handler的线程,不仅限于视图任务。选择方法取决于具体需求和上下文。
38 0
|
2月前
|
Android开发 Kotlin
Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
**Kotlin中的匿名函数与Lambda表达式概述:** 匿名函数(`fun`关键字,明确返回类型,支持非局部返回)适合复杂逻辑,而Lambda(简洁语法,类型推断)常用于内联操作和高阶函数参数。两者在语法、返回类型和使用场景上有所区别,但都提供无名函数的能力。
21 0
|
前端开发 测试技术 Android开发
前端常见兼容问题系列5:¥符号在部分Android APP的WebView中不见了
在一些安卓机型中,¥符号在某些Android APP的WebView中显示不正确,会受到页面元素lang属性设置的影响。
3163 0
|
3天前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
1天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
3天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
14 5
|
3天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发:平台选择的艺术与科学
在移动应用开发的广阔天地中,安卓与iOS两大平台如同东西方哲学的碰撞,既有共通之处又各具特色。本文将深入探讨这两个平台的设计理念、开发工具和市场定位,旨在为开发者提供一份简明扼要的指南,帮助他们在这场技术与商业的博弈中找到自己的道路。通过比较分析,我们将揭示每个平台的优势与局限,以及它们如何影响应用的性能、用户体验和市场接受度。无论你是初涉江湖的新手,还是经验丰富的老手,这篇文章都将为你的选择提供新的视角和思考。
16 5