使用 gradle 在编译时动态设置 Android resValue BuildConfig Manifes中 m

                       

转载请标明出处:http://blog.csdn.net/xx326664162/article/details/49247815    文章出自:薛瑄的博客

你也可以查看我的其他同类文章,也会让你有一定的收货

关于使用Gradle来控制版本和生成不同版本的代码,我总结了三篇文章,网上关于这些知识,都比较零散,我在学习这些的之前,根本不知道还有这样的方法。所以说不知道并不可怕,可怕的是不知道自己不知道。相信这三篇文章,会给你不少灵感

Gradle构建控制Log开关——BuildConfig\自定义

使用 gradle 在编译时动态设置 Android resValue / BuildConfig / Manifes中 < meta-data>变量的值

Gradle编译生成不同的版本,动态设定应用标题 / 应用图标 / 替换常量

前言

在项目中,我们有时会需要根据不同的项目环境,使用不同的项目变量,

举例:

  • 在测试环境中需要app访问的服务器地址是测试服务器
  • 正式发布下的app需要访问正式服务器。

可以使用下面三种技术来满足要求:

一、使用 gradle 在编译时动态设置 Android resValue

修改 res value 的方式,比如修改 strings.xml 文件中的 AppName 的值

在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 体内写上类似:

resValue "string", "AppName", "app1"
   
   
  • 1

相当于在res/strings.xml 下增加一个名为 AppName,值为app1  的资源。在java中的使用resValue和strings.xml的方法是一样的,context.getResources().getString(R.string.strKey);


二、使用 gradle 在编译时动态设置 Android BuildConfig

在你的 gradle 文件 buildTypes 或者 productFlavors 下面,如 release 体内写上类似:

buildConfigField "String", "ENDPOINT", "\"http://example.com\""
   
   
  • 1

gradle sync 一下后,BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就可以供 Java 代码调用了。

如何使用在java中使用,详见这篇文章


三、使用 gradle 在编译时动态设置 Android Manifest

下面介绍如何设置标签中的变量,如何使用标签中的变量,请参考这里

方法一:(不推荐)

在之前版本的gradle中,大部分的思路都是在AndroidManifest中定义一个变量,然后在编译的时候,找出那个AndroidManifest中的变量,将它替换掉。

如友盟的多渠道打包,在原来的 AndroidManifest.xml 文件中添加:

 <meta-data android:value="UMENG_CHANNEL_VALUE"               android:name="UMENG_CHANNEL"/>
   
   
  • 1
  • 2
  • 3
  • 4

然后使用在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")        }   }}
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

方法二:使用manifestPlaceholders改变< meta-data>(推荐)

而在新版本的gradle中,processManifest这个方法被移除掉了,而提供了一个新的功能manifestPlaceholders,我们可以在AndroidManifest中定义一个变量,在build.gradle中动态的替换掉,十分方便,语法也十分简单。对比上面的功能,我们需要动态替换友盟的appkey,需要在AndroidManifest中定义一个变量

<meta-data         android:name="UMENG_APPKEY"         android:value="${umeng_app_key}"/>
   
   
  • 1
  • 2
  • 3
  • 4

接着,我们在build.gradle文件中根据不同的环境,生成不同appkey的apk。

buildTypes {        debug {         manifestPlaceholders = [umeng_app_key: "你替代的内容"]        }        release {       manifestPlaceholders = [umeng_app_key: "你替代的内容"]        }        develop {       manifestPlaceholders = [umeng_app_key: "你替代的内容"]        }    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意:这里的“你替代的内容”,不能为特殊关键词,比如:TRUE,否则在Java代码中获取不到meta-data中的值,

错误示例:

manifestPlaceholders = [oem: "TRUE"]
   
   
  • 1

运行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}"/>
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
buildTypes {        debug {    manifestPlaceholders = [umeng_app_key: "你替代的内容",umeng_app_secret:"你要替换的内容"]        }        ...    }
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

如何在Android获取Manifest中< meta-data>元素的值


参考
http://hong1024.com/2015/02/10/使用manifestPlaceholders替换变量/
http://write.blog.csdn.net/mdeditor#!postId=49247815

关注我的公众号,轻松了解和学习更多技术
这里写图片描述

           

猜你喜欢

转载自blog.csdn.net/qq_44949789/article/details/89640135