基本思路:在AndroidManifest.xml文件中设置一个placeholder,打包的时候动态替换该placeholder。
- 通过如下方式在AndroidManifest.xml文件中设置一个placeholder(这里placeholder名为“APP_CHANNEL_VALUE”):
AndroidManifest.xml:
<meta-data
android:name="APP_CHANNEL"
android:value="${APP_CHANNEL_VALUE}" />
- 在build.gradle文件中动态替换placeholder:
huild.gradle:
android{
...
productFlavors {
yingyongbao {}
xiaomi {}
huawei {}
...
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name]
}
}
经过上述两步操作,执行打包命令gradlew assembleRelease
,就能获得不同渠道的安装包了。
注意
有时,我们在AndroidManifest.xml文件当中配置了多个placeholder,比如我们在上述AndroidManifest.xml中再添加一个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}" />
这时会报这样的问题:
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]
}
}
这样修改之后问题依然存在。我们看一下这个问题的原因:
manifestPlaceholders是一个变量,我们在defaultConfig当中赋值,又在productFlavor.all中赋值,前面的赋值就被覆盖掉了。
进一步讲,manifestPlaceholders是一个数组变量,赋值的时候我们应该把所有placeholder组成一个数组赋值给manifestPlaceholders。
正确的做法:
huild.gradle:
android{
...
productFlavors {
yingyongbao {}
xiaomi {}
huawei {}
...
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [APP_CHANNEL_VALUE:name,
APP_KEY_VALUE:"appkey"]
}
}
进阶->配置文件外移
在根目录下创建local.properties
文件,并添加如下内容:
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")]
}
}