赞
踩
今天打包的时候,运营表示需要一个vivo渠道的包,桌面名称要和其他渠道不同,如果只有这一次需求的话,大可以修改了清单文件中的application的label就行,打完包后再改回原来的,但考虑到目前马甲包的数量以及后续的升级打包,还是决定在gradle中做渠道区分配置,不同渠道使用manifestPlaceholders占位符替换label的字符串引用,形式如下
- VivoStore {
- manifestPlaceholders = [APP_NAME: "@string/app_name_vivo"]
- }
APP_NAME在清单文件中申明
- <application
- 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中的申明,渠道中的修改未起到作用
因为对具体的机制不是很清楚,所以这只是我的一个猜想,如果各位有其他的想法,欢迎交流
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。