赞
踩
前言
在项目中,我们有时会需要根据不同的项目环境,使用不同的项目变量,比如说,我在测试环境中需要我的app访问的服务器地址是测试服务器上,而正式发布下的app需要访问正式服务器。在这种情况下,我们可以将这个变量放在AndroidManifest文件中,根据不同的编译类型生成服务器指向不同的app。
实现
在之前版本的gradle中,大部分的思路都是在AndroidManifest中定义一个变量,然后在编译的时候,找出那个AndroidManifest中的变量,将它替换掉。
如友盟的多渠道打包,在原来的 AndroidManifest.xml 文件中添加:
-
- <meta-data android:value="UMENG_CHANNEL_VALUE"
- android:name="UMENG_CHANNEL"/>
然后使用在build.gradle中找出UMENG_CHANNEL_VALUE这个值,并且替换掉
- android.applicationVariants.all{ variant ->
- println "${variant.productFlavors[0].name}"
- variant.processManifest.doLast{
- copy{
- from("${buildDir}/manifests"){
- include "${variant.dirName}/AndroidManifest.xml"
- }
- into("${buildDir}/manifests/$variant.name")
- filter{
- String line ->line.replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
- }
- variant.processResources.manifestFile = file("${buildDir}/manifests/${variant.name}/${variant.dirName}/AndroidManifest.xml")
- }
- }
- }
而在新版本的gradle中,processManifest这个方法被移除掉了,而提供了一个新的功能manifestPlaceholders,我们可以在AndroidManifest中定义一个变量,在build.gradle中动态的替换掉,十分方便,语法也十分简单。对比上面的功能,我们需要动态替换友盟的appkey,需要在AndroidManifest中定义一个变量
- <meta-data
- android:name="UMENG_APPKEY"
- android:value="${umeng_app_key}"/>
接着,我们在build.gradle文件中根据不同的环境,生成不同appkey的apk。
- buildTypes {
- debug {
- manifestPlaceholders = [umeng_app_key: "你替代的内容"]
- }
- release {
- manifestPlaceholders = [umeng_app_key: "你替代的内容"]
- }
- develop {
- manifestPlaceholders = [umeng_app_key: "你替代的内容"]
- }
- }
运行gralde clean build,你就可以生成不同的appkey的apk,是不是感觉好多了。^ ^
如果你想要替换多个变量,假如你需要两个变量要替换,需要按照下面形式进行
- <meta-data
- android:name="UMENG_APPKEY"
- android:value="${umeng_app_key}"/>
- <meta-data
- android:name="UMENG_SECRET"
- android:value="${umeng_app_secret}"/>
- buildTypes {
- debug {
- manifestPlaceholders = [umeng_app_key: "你替代的内容",umeng_app_secret:"你要替换的内容"]
- }
- ...
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。