• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
juejin
帮助502

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。是不是很妙!

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanejii
系列文章
更多 icon
同类精品
更多 icon
继续加载