转载请标明出处: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
关注我的公众号,轻松了解和学习更多技术