当前位置:   article > 正文

manifestPlaceholders占位符失效_manifestplaceholders不生效

manifestplaceholders不生效

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

  1. VivoStore {
  2. manifestPlaceholders = [APP_NAME: "@string/app_name_vivo"]
  3. }

APP_NAME在清单文件中申明

  1. <application
  2. android:name="com.cjkt.repmmath.application.MyApplication"
  3. android:allowBackup="true"
  4. android:icon="@mipmap/icon_logo"
  5. tools:replace="android:label"
  6. android:label="${APP_NAME}"
  7. android:supportsRtl="true"
  8. android:theme="@style/AppTheme">

考虑到其他渠道的一致性,在gradle的defaultConfig中申明统一的替换方案

  1. defaultConfig {
  2. applicationId config.applicationId
  3. minSdkVersion config.minSdkVersion
  4. targetSdkVersion config.targetSdkVersion
  5. versionCode config.versionCode
  6. versionName config.versionName
  7. multiDexEnabled true
  8. manifestPlaceholders = [
  9. APP_NAME : "@string/app_name",
  10. APPLICATION_ID: config.applicationId,
  11. ]
  12. }

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

  1. productFlavors.all {
  2. flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
  3. }

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

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

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

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

 

提到的文章:https://www.jianshu.com/p/1d5271c2c366

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/265346
推荐阅读
相关标签
  

闽ICP备14008679号