manifestPlaceholders占位符失效

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

VivoStore {manifestPlaceholders = [APP_NAME: "@string/app_name_vivo"]}

APP_NAME在清单文件中申明

 <applicationandroid: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.applicationIdminSdkVersion config.minSdkVersiontargetSdkVersion config.targetSdkVersionversionCode config.versionCodeversionName config.versionNamemultiDexEnabled truemanifestPlaceholders = [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