持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第23天,点击查看活动详情
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。是不是很妙!
这里多思考一下,很多配置会变得更加灵活。