转载 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"
相当于在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\""
gradle sync 一下后,BuildConfig.ENDPOINT 就会被赋值为 http://example.com 就可以供 Java 代码调用了。
如何使用在java中使用,详见这篇文章
使用 gradle 在编译时动态设置 Android Manifest
下面介绍如何设置标签中的变量,如何使用标签中的变量,请参考这里
使用manifestPlaceholders改变< meta-data>(推荐)
而在新版本的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: "你替代的内容"]
}
}
注意:这里的“你替代的内容”,不能为特殊关键词,比如:TRUE,否则在Java代码中获取不到meta-data中的值,
错误示例:
manifestPlaceholders = [oem: "TRUE"]
运行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:"你要替换的内容"]
}
...
}