manifestPlaceholders占位符失效

今天打包的时候,运营表示需要一个vivo渠道的包,桌面名称要和其他渠道不同,如果只有这一次需求的话,大可以修改了清单文件中的application的label就行,打完包后再改回原来的,但考虑到目前马甲包的数量以及后续的升级打包,还是决定在gradle中做渠道区分配置,不同渠道使用manifestPlaceholders占位符替换label的字符串引用,形式如下

VivoStore {
manifestPlaceholders = [APP_NAME: "@string/app_name_vivo"]
}
APP_NAME在清单文件中申明

android:name="com.cjkt.repmmath.application.MyApplication"
android:allowBackup="true"
android:icon="@mipmap/icon_logo"
tools:replace="android:label"
android:label="${APP_NAME}"
android:supportsRtl="true"
android:theme="@style/AppTheme">
考虑到其他渠道的一致性,在gradle的defaultConfig中申明统一的替换方案

defaultConfig {
applicationId config.applicationId
minSdkVersion config.minSdkVersion
targetSdkVersion config.targetSdkVersion
versionCode config.versionCode
versionName config.versionName
multiDexEnabled true

    manifestPlaceholders = [
            APP_NAME      : "@string/app_name",
            APPLICATION_ID: config.applicationId,
    ]

}
基本上这样就算完成了,可我试了很多次都不能替换成新的label包名,后来搜索到一篇文章,提到

productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
这段代码导致了渠道中的占位符替换没有成功,我把代码删除后,在每个渠道中单独加入了上述占位符代码,打包后测试确实成功替换了,但具体的原因,那篇文章中只说了引用了 全局变量导致问题的发生

我觉得这个原因有点难以理解,因为这段代码无论放在那里都要引用UMENG_CHANNEL_VALUE这个变量,我个人猜测是manifestPlaceholders占位符每次使用时会清除上次的修改,为此,我在gradle中打印了每个使用到占位符配置的先后执行顺序,结果显示最先执行的是defaultConfig中的占位符代码,接着是渠道中的占位符代码,最后是productFlavors.all中的占位符代码,如果按我的猜想来看,最后执行的占位符代码会清除上一次的修改,导致在渠道中的占位符替换失败

还有个可能是flavor.manifestPlaceholders引用了在渠道中申明的占位符,导致其中原来的APP_NAME替换被UMENG_CHANNEL_VALUE所覆盖,也就是说APP_NAME的替换仍旧维持defalutConfig中的申明,渠道中的修改未起到作用

因为对具体的机制不是很清楚,所以这只是我的一个猜想,如果各位有其他的想法,欢迎交流

提到的文章:https://www.jianshu.com/p/1d5271c2c366
————————————————
版权声明:本文为CSDN博主「tushiba」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tushiba/article/details/96862824

你可能感兴趣的:(manifestPlaceholders占位符失效)