基本思路:在AndroidManifest.xml文件中設(shè)置一個(gè)placeholder,打包的時(shí)候動(dòng)態(tài)替換該placeholder。
- 通過如下方式在AndroidManifest.xml文件中設(shè)置一個(gè)placeholder(這里placeholder名為“APP_CHANNEL_VALUE”):
AndroidManifest.xml:
<meta-data
android:name="APP_CHANNEL"
android:value="${APP_CHANNEL_VALUE}" />
- 在build.gradle文件中動(dòng)態(tài)替換placeholder:
huild.gradle:
android{
...
productFlavors {
yingyongbao {}
xiaomi {}
huawei {}
...
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name]
}
}
經(jīng)過上述兩步操作,執(zhí)行打包命令gradlew assembleRelease,就能獲得不同渠道的安裝包了。
注意
有時(shí),我們?cè)贏ndroidManifest.xml文件當(dāng)中配置了多個(gè)placeholder,比如我們?cè)谏鲜鯝ndroidManifest.xml中再添加一個(gè)placeholder,名字為APP_KEY_VALUE:
AndroidManifest.xml:
<meta-data
android:name="APP_CHANNEL"
android:value="${APP_CHANNEL_VALUE}" />
<meta-data
android:name="APP_KEY"
android:value="${APP_KEY_VALUE}" />
這時(shí)會(huì)報(bào)這樣的問題:
Error:(74, 13) Attribute meta-data#APP_KEY@value at AndroidManifest.xml:74:13 requires a placeholder substitution but no value for <APP_KEY> is provided.
問題的原因是沒有為APP_KEY_VALUE提供值。下面我們嘗試修改:
huild.gradle:
android{
defaultConfig {
manifestPlaceholders = [APP_KEY_VALUE : "appkey"]
}
...
productFlavors {
yingyongbao {}
xiaomi {}
huawei {}
...
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name]
}
}
這樣修改之后問題依然存在。我們看一下這個(gè)問題的原因:
manifestPlaceholders是一個(gè)變量,我們?cè)赿efaultConfig當(dāng)中賦值,又在productFlavor.all中賦值,前面的賦值就被覆蓋掉了。
進(jìn)一步講,manifestPlaceholders是一個(gè)數(shù)組變量,賦值的時(shí)候我們應(yīng)該把所有placeholder組成一個(gè)數(shù)組賦值給manifestPlaceholders。
正確的做法:
huild.gradle:
android{
...
productFlavors {
yingyongbao {}
xiaomi {}
huawei {}
...
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name,
APP_KEY_VALUE:"appkey"]
}
}
進(jìn)階->配置文件外移
在根目錄下創(chuàng)建local.properties文件,并添加如下內(nèi)容:
local.properties
sdk.dir = /android/sdk/dir
appkey:"realAppkey"
在build.gradle文件中引用:
huild.gradle:
apply plugin: 'com.android.application'
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
android{
...
productFlavors {
yingyongbao {}
xiaomi {}
huawei {}
...
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name,
APP_KEY_VALUE:properties.getProperty("appkey")]
}
}