学新通技术网

【Gradle 学习】(九)manifestPlaceholders 处理占位符

juejin 10 1
【Gradle 学习】(九)manifestPlaceholders 处理占位符

AndroidManifest 里的占位符

在 defaultConfig{} 还有个很常用的配置- mainifestPlaceholders,顾名思义,这个属性是 manifest 的占位符,和 AndroidManifest.xml 相关的。

AndroidManifest.xml 这个文件并不陌生了,其实很多配置都是在这里定义的,当我们使用三方应用的时候,三方应用的key,或者统计分析的渠道都这里配置。

比如使用友盟统计分析平台,我们需要根据渠道进行统计,比如 google,华为等渠道的活跃度,埋点数据等。

使用友盟的 SDK 需要在 AndroidManifest 中配置一个名为 UMENG_CHANNEL 的 meta-data

 <meta-data
    android:name="UMENG_CHANNEL"
    android:value="Umeng" 
 />

这个 meta-data 本质是一个 bundle,这里这个值这里的 value 是 Umeng, 这个值标识的就是 apk 是哪个渠道,如果要发布多个渠道,可以在 manifestPlaceholders 定义这个值。这里 meta-data 的 value 就需要用一个占位符的方式表达,表达方式如下

<meta-data 
    android:name="UMENG_CHANNEL"
    android:value="${UMENG_CHANNEL_VALUE}"
/>

上面 ${UMENG_CHANNEL_VALUE} 就是一个占位符,在 gradle 的 defaultConfig{} 中 通过 manifestPlaceholders 动态替换 AndroidManifest 文件里定义的占位符:

android {
    defaultConfig {
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: 'dev']
    }
}

这段代码块的意思就是 ${UMENG_CHANNEL_VALUE} 占位符会被 dev 这个字符串所替换,也就是 UMENG_CHANNEL 值为 dev。

除了 defaultConfig 可以这样设置,buildType 和 productFlavor 也都可以配置 manifeatPlaceholders ,它的本质是一个 Map,所以也可以使用键值对的方式定义,可以使用 put(value, key)

productFlavor 中应用

我们看一下实际项目通常都怎么使用呢?

继续上面的例子,我们可以根据不同的渠道为统计定义不同渠道值,我们前面已经学习过,不同渠道产品的定制,设置的是 productFlavor,那么就可以这样定义

android  {
    productFlavors {
        google{
            applicationId "cn.tina.google"
            manifestPlaceholders.put("UMENG_CHANNEL_VALUE",'google')
        }
        huawei{
            applicationId "cn.tina.huawei"
            manifestPlaceholders.put("UMENG_CHANNEL_VALUE",'huawei')
        }
    }
}

这样分别为不同的产品定义不同的友盟渠道值。这里我们也可以用一下更灵活的方式处理,循环每个productFlavor,并把他们的 UMENG_CHANNEL_VALUE 设置为自己的 name,就不需要每个渠道都去定义了,这也可见 Gradle 的强大和灵活。

productFlavors.all { flavor ->
        manifestPlaceholders.put("UMENG_CHANNEL_VALUE",name)
}

buildType 中应用

除了具体的产品需要一些定制,我们在开发过程中也需要不同的环境配置,比如配置极光推送,测试环境使用的是测试 key,正式环境使用的正式 key,也可以通过这种方式来动态替换。

<meta-data
  android:name="JPUSH_APPKEY"
  android:value="${JPUSH_APPKEY}" 
/>

buildTypes{} 中动态配置 key

android  {
    buildTypes {
        debug {
            manifestPlaceholders = [JPUSH_APPKEY : "testKey"]
        }
        release {
            manifestPlaceholders = [JPUSH_APPKEY : "formalKey"]
        }
    }
}

其他应用

除了动态处理三方的一些占位,meta-data 中的值我们也是可以拿到的,所以当然也可以自己来定义一些想动态处理的值,能想到这里,可以应用的场景就更多了。

在 gradle 的脚本文件中本身也可以使用字符串占位方式,那么这里的 value 值的定义又可以有多种方式,如果配合着 gradle.properties 使用就更加灵活了。

如果使用了 gradle.properties 做 key-value 的定义,支持Gradle编译功能的插件或工具也可以使用,比如jenkins。是不是很妙!

这里多思考一下,很多配置会变得更加灵活。

本文出至:学新通技术网

标签: