Android Makefile之默认Ringtone显示None

问题:

偶遇一个问题是默认Ringtone显示None,而事实上是有配置默认铃声的

通过命令看ringtone 出现none是由于 ro.config.ringtone的值是错误的,看起来像是配置不正确

android@ubuntu:~$ adb shell getprop ro.config.notification_sound
Snap.ogg
android@ubuntu:~$ adb shell getprop ro.config.alarm_alert
Get_up_and_go.ogg
android@ubuntu:~$ adb shell getprop ro.config.ringtone
ro.config.notification_sound=ro.config.alarm_alert=persist.tinno.save.feature=1

那就找到ro.config.ringtone配置的地方吧
不过代码vendor下有几个config.mk都有配置,是哪一个呢通过build log可以查看到

本地编译的版本的相关build log如下:

vendor/***/requirement/***/cars_fr.mk:2: --tonsal vendor/***/requirement/cars_fr
vendor/***/requirement/***/cars_fr.mk:26: cars_sound_1_3 -for *** requrement cars_fr.mk *******SOUND_VERSION*****-
vendor/***/requirement/cars_fr/cars_fr.mk:145: --ro.config.ringtone=Snap.ogg
//可见需要的项目的sound资源对应在vendor下的vendor/***/requirement/cars_fr目录内,
//ro.config.ringtone的值为 Snap.ogg,均没有问题

另外从cars_fr.mk中可以得到资源的配置如下:

ifneq ($(strip $(WIKO_SOUND_VERSION)),)
ifeq ($(findstring _1_0, $(strip $(WIKO_SOUND_VERSION))),_1_0)
......//省略_1_0 version的设置
else ifeq ($(findstring _1_1, $(strip $(WIKO_SOUND_VERSION))),_1_1)
......//省略_1_1 version的设置
else ifeq ($(findstring _1_2, $(strip $(WIKO_SOUND_VERSION))),_1_2)
......//省略_1_2 version的设置
else ifeq ($(findstring _1_3, $(strip $(WIKO_SOUND_VERSION))),_1_3)
RING_TONE := Snap.ogg
NOTIFICATION_SOUND := Snap.ogg
ALARM_ALERT := Get_up_and_go.ogg
PRODUCT_PROPERTY_OVERRIDES += ro.config.ringtone=$(RING_TONE) 
PRODUCT_PROPERTY_OVERRIDES += ro.config.notification_sound=$(NOTIFICATION_SOUND) 
PRODUCT_PROPERTY_OVERRIDES += ro.config.alarm_alert=$(ALARM_ALERT)
$(warning --ro.config.ringtone = $(RING_TONE)) //该函数会输出warning后面的ringtone信息

看起来配置也没有问题,可能是编译脚本出现问题导致ro.config.ringtone被赋值
经过检查vendor/*/###/cars_fr/SUB_PROJECTS/orange/config.mk文件可能有如下问题:

TIME_ZONE := Europe/Brussels
DATE_FORMAT := dd-MM-yyyy
#RING_TONE := Snap.ogg
#NOTIFICATION_SOUND := Snap.ogg
#ALARM_ALERT := Get_up_and_go.ogg
.
.
...
PRODUCT_PROPERTY_OVERRIDES += ro.com.android.dateformat=$(DATE_FORMAT) 
PRODUCT_PROPERTY_OVERRIDES += ro.config.ringtone=$(RING_TONE) 
PRODUCT_PROPERTY_OVERRIDES += ro.config.notification_sound=$(NOTIFICATION_SOUND) 
PRODUCT_PROPERTY_OVERRIDES += ro.config.alarm_alert=$(ALARM_ALERT)
...
PRODUCT_PROPERTY_OVERRIDES += persist.cars.save.feature=1
$(warning smart_standby_conf.xml COPIED to system/etc.)
...
ifeq ($(strip $(FEATURE_CARS_LEGAL)), yes)
CARS_LEGAL_NAME:=carslegal_1.4
PRODUCT_PROPERTY_OVERRIDES += ro.feature.cars.legal=1
$(warning configs.mk, FEATURE_CARS_LEGAL is open)
...

猜测:
开始RING_TONE、NOTIFICATION_SOUND和ALARM_ALERT 被注释掉,所以ro.config.ringtone赋值时$(RING_TONE)不存在,可能导致后面PRODUCT_PROPERTY_OVERRIDES的部分全部赋值给ro.config.ringtone,一致到ro.feature.cars.legal,因为ro.feature.cars.legal前面有个条件,因此 ro.config.ringtone得到的值是ro.config.notification_sound=ro.config.alarm_alert=persist.tinno.save.feature=1

adb shell getprop persist.cars.save.feature 

没有输出值,符合

综上,修改vendor/*/###/cars_fr/SUB_PROJECTS/orange/config.mk,注释掉以下部分本地编译进行验证:

PRODUCT_PROPERTY_OVERRIDES += ro.com.android.dateformat=$(DATE_FORMAT) 
#PRODUCT_PROPERTY_OVERRIDES += ro.config.ringtone=$(RING_TONE)
#PRODUCT_PROPERTY_OVERRIDES += ro.config.notification_sound=$(NOTIFICATION_SOUND) 
#PRODUCT_PROPERTY_OVERRIDES += ro.config.alarm_alert=$(ALARM_ALERT)

注释后本地编译版本验证是OK的

Android Makefile

本问题引起是Android Makefile引起的,下面是部分涉及的Android Makefile 常用函数内容

inherit-product 函数

  $(call inherit-product, vendor/dolby/ds/dolby-product.mk)

inherit-product 函数的定义位于 build/core/product.mk 文件中

#  
# $(1): product to inherit  
#  
# Does three things:  
#  1. Inherits all of the variables from $1.  
#  2. Records the inheritance in the .INHERITS_FROM variable  
#  3. Records that we've visited this node, in ALL_PRODUCTS  
#  
define inherit-product  
  $(if $(findstring ../,$(1)),\  
    $(eval np := $(call normalize-paths,$(1))),\  
    $(eval np := $(strip $(1))))\  
  $(foreach v,$(_product_var_list), \  
      $(eval $(v) := $($(v)) $(INHERIT_TAG)$(np))) \  
  $(eval inherit_var := \  
      PRODUCTS.$(strip $(word 1,$(_include_stack))).INHERITS_FROM) \  
  $(eval $(inherit_var) := $(sort $($(inherit_var)) $(np))) \  
  $(eval inherit_var:=) \  
  $(eval ALL_PRODUCTS := $(sort $(ALL_PRODUCTS) $(word 1,$(_include_stack))))  
endef  

从注释中可以看到,inherit-product 函数除了会执行通过其参数传入的 Makefile 文件之外,还会额外做 3 件事:
1、继承通过参数传入的 Makefile 文件中的所有变量;
2、在 .INHERITS_FROM 变量中记录下这些继承关系;
3、在 ALL_PRODUCTS 变量中标识出当前操作的 Makefile 文件已经被访问过了(以免重复访问)。

而 include 则只会执行 Makefile 文件,不会进行上方所述的 3 个操作。

$(warning TEXT…)

**函数功能**:函数“warning”类似于函数“error”,区别在于它不会导致致命错误(make 不退出),而只是提示“TEXT...”,make 的执行过程继续。
**返回值**:空
**函数说明**:用法和“error”类似,展开过程相同。

call函数

“call”函数是唯一一个可以创建定制化参数函数的引用函数。使用这个函数可以实现对用户自己定义函数引用。我们可以将一个变量定义为一个复杂的表达式,用“call”函数根据不同的参数对它进行展开来获得不同的结果。
函数语法:
$(call VARIABLE,PARAM,PARAM,…)
函数功能: 在执行时,将它的参数“PARAM”依次赋值给临时变量“ (1) (2)”
(这些临时变量定义在“VARIABLE”的值中,参考下边的例子)……

call 函数对参数的数目没有限制,也可以没有参数值,没有参数值的“call”没有任何实际存在的意义。执行时变量“VARIABLE”被展开为在函数上下文有效的临时变量,变量定义中的“$(1)”作为第一个参数,并将函数参数值中的第一个参数赋值给它;变量中的“$(2)”一样被赋值为函数的第二个参数值;依此类推(变量$(0)代表变量“VARIABLE”本身)。之后对变量“VARIABLE” 表达式的计算值。

if 函数

函数“if”提供了一个在函数上下文中实现条件判断的功能。就像make所支持的条
件语句—ifeq
函数语法:
$(if CONDITION,THEN-PART[,ELSE-PART])
函数功能:第一个参数“CONDITION”,在函数执行时忽略其前导和结尾空字

符,如果包含对其他变量或者函数的引用则进行展开。如果“CONDITION”的
展开结果非空,则条件为真,就将第二个参数“THEN_PATR”作为函数的计算
表达式;
“CONDITION”的展开结果为空,将第三个参数“ELSE-PART”作为
函数的表达式,函数的返回结果为有效表达式的计算结果。
返回值:根据条件决定函数的返回值是第一个或者第二个参数表达式的计算结
果。当不存在第三个参数“ELSE-PART”,并且“CONDITION”展开为空,函
数返回空。
函数说明:函数的条件表达式“CONDITION”决定了函数的返回值只能是
“THEN-PART”或者“ELSE-PART”两个之一的计算结果。
函数示例:
SUBDIR += (if (SRC_DIR) $(SRC_DIR),/home/src)
函数的结果是:如果“SRC_DIR”变量值不为空,则将变量“SRC_DIR”指定
的目录作为一个子目录;否则将目录“/home/src”作为一个子目录

$(findstring FIND,IN)

函数名称:查找字符串函数—findstring。
函数功能:搜索字串“IN”,查找“FIND”字串。
返回值:如果在“IN”之中存在“FIND”,则返回“FIND”,否则返回空。
函数说明:字串“IN”之中可以包含空格、[Tab]。搜索需要是严格的文本匹配。
示例:

$(findstring a,a b c)
$(findstring a,b c)

第一个函数结果是字“a”;第二个值为空字符。

关键字“ifeq”

此关键字用来判断参数是否相等,格式如下:

`ifeq (ARG1, ARG2)'
`ifeq 'ARG1' 'ARG2''
`ifeq "ARG1" "ARG2"'
`ifeq "ARG1" 'ARG2''
`ifeq 'ARG1' "ARG2"'

替换展开“ARG1”和“ARG1”后,对它们的值进行比较。如果相同则(条件为真)将“TEXT-IF-TRUE”作为 make 要执行的一部分,否则将“TEXT-IF-FALSE”作为 make 要执行的一部分(上边的第二种格式)。
通常我们会使用它来判断一个变量的值是否为空(不是任何字符)。参数值可能是通过引用变量或者函数得到的,因而在展开过程中可能造成参数值中包含空字符(空格等)。一般在这种情况时我们使用make的“strip”函数(参考 8.2 文本处理函数 一节)来对它变量的值进行处理,去掉其中的空字符。格式为:

ifeq ($(strip $(foo)),)
TEXT-IF-EMPTY
endif

这样,即就是在“$(foo)”中存在若干前导和结尾空格,“TEXT-IF-EMPTY”也会被作为 Makefile 需要执行的一部分。

变量取值

变量定义解析的规则如下:

IMMEDIATE = DEFERRED
IMMEDIATE ?= DEFERRED
IMMEDIATE := IMMEDIATE
IMMEDIATE += DEFERRED or IMMEDIATE
define IMMEDIATE
DEFERRED
Endef

当变量使用追加符(+=)时,如果此前这个变量是一个简单变量(使用 :=定义的)则认为它是立即展开的,其它情况时都被认为是“延后”展开的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安德路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值