android多渠道打包

基本思路:在AndroidManifest.xml文件中设置一个placeholder,打包的时候动态替换该placeholder。

  1. 通过如下方式在AndroidManifest.xml文件中设置一个placeholder(这里placeholder名为“APP_CHANNEL_VALUE”):
AndroidManifest.xml:


  1. 在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:



这时会报这样的问题:

Error:(74, 13) Attribute meta-data#APP_KEY@value at AndroidManifest.xml:74:13 requires a placeholder substitution but no value for 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")]
    }
}

你可能感兴趣的:(android多渠道打包)