今天打包的時(shí)候,運(yùn)營(yíng)表示需要一個(gè)vivo渠道的包,桌面名稱(chēng)要和其他渠道不同,如果只有這一次需求的話,大可以修改了清單文件中的application的label就行,打完包后再改回原來(lái)的,但考慮到目前馬甲包的數(shù)量以及后續(xù)的升級(jí)打包,還是決定在gradle中做渠道區(qū)分配置,不同渠道使用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中申明統(tǒng)一的替換方案
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包名,后來(lái)搜索到一篇文章,提到
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
這段代碼導(dǎo)致了渠道中的占位符替換沒(méi)有成功,我把代碼刪除后,在每個(gè)渠道中單獨(dú)加入了上述占位符代碼,打包后測(cè)試確實(shí)成功替換了,但具體的原因,那篇文章中只說(shuō)了引用了 全局變量導(dǎo)致問(wèn)題的發(fā)生
我覺(jué)得這個(gè)原因有點(diǎn)難以理解,因?yàn)檫@段代碼無(wú)論放在那里都要引用UMENG_CHANNEL_VALUE這個(gè)變量,我個(gè)人猜測(cè)是manifestPlaceholders占位符每次使用時(shí)會(huì)清除上次的修改,為此,我在gradle中打印了每個(gè)使用到占位符配置的先后執(zhí)行順序,結(jié)果顯示最先執(zhí)行的是defaultConfig中的占位符代碼,接著是渠道中的占位符代碼,最后是productFlavors.all中的占位符代碼,如果按我的猜想來(lái)看,最后執(zhí)行的占位符代碼會(huì)清除上一次的修改,導(dǎo)致在渠道中的占位符替換失敗
還有個(gè)可能是flavor.manifestPlaceholders引用了在渠道中申明的占位符,導(dǎo)致其中原來(lái)的APP_NAME替換被UMENG_CHANNEL_VALUE所覆蓋,也就是說(shuō)APP_NAME的替換仍舊維持defalutConfig中的申明,渠道中的修改未起到作用
因?yàn)閷?duì)具體的機(jī)制不是很清楚,所以這只是我的一個(gè)猜想,如果各位有其他的想法,歡迎交流
提到的文章:http://www.itdecent.cn/p/1d5271c2c366
————————————————
版權(quán)聲明:本文為CSDN博主「tushiba」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/tushiba/article/details/96862824