Gradle 中 buildConfigField的巧妙应用
当用AndroidStudio来进行Android项目开发时,build.gradle就是这个工具的核心部分,所有的依赖,debug/release设置,混淆等都在这里进行配置。
下面就主要来记录下利用buildConfigField来为我们的项目进行动态配置的目的
eg:debug:打印日志,在内网测试,利用签名
release:关闭日志,外网,签名等
先贴出一个完事的build.gradle文件,如下:
apply plugin: 'com.android.application'
apply plugin: 'AndResGuard'//利用微信的资源混淆工具
//apply plugin: 'io.fabric'
buildscript {
repositories {
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
dependencies {
// The Fabric Gradle plugin uses an open ended version to react
// quickly to Android tooling updates
classpath 'io.fabric.tools:gradle:latest.integration'
}
}
repositories {
jcenter()
maven { url 'https://maven.fabric.io/public' }
}
android {
compileSdkVersion 21
buildToolsVersion "22.0.1"
packagingOptions {
exclude 'LICENSE.txt'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/dependencies'
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
exclude 'META-INF/LICENSE'
exclude 'META-INF/license'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/notice'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/README.txt'
exclude 'META-INF/services/javax.annotation.processing.Processor'
exclude '!META-INF/MANIFEST.MF'
exclude 'META-INF/MANIFEST.MF'
}
defaultConfig {
targetSdkVersion 21
// multiDexEnabled true
}
/**
* 这前用上面multiDexEnabled true时,
* 突然在5.0以下的手机上跑不起来,
* 改成下面这种写法就可以了。
*/
dexOptions {
jumboMode true
}
signingConfigs {
release {
try {
storeFile file("../keystore/Het_KeyStore.keystore")//这里替换成你自己项目生成的keystore的存储路径
storePassword "szhittech"
keyAlias "Clife"
keyPassword "szhittechclife"
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
debug {
try {
storeFile file("../keystore/Het_KeyStore.keystore")
storePassword "szhittech"
keyAlias "Clife"
keyPassword "szhittechclife"
} catch (ex) {
throw new InvalidUserDataException(ex.toString())
}
}
}
buildTypes {
release {
buildConfigField("boolean", "LOG_DEBUG", "false")
buildConfigField "String", "SERVER_HOST", "\"api.clife.cn/\""
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//是否清理无用资源
shrinkResources true
//是否启用zipAlign压缩
zipAlignEnabled true
pseudoLocalesEnabled true
signingConfig signingConfigs.release
}
debug {
buildConfigField("boolean", "LOG_DEBUG", "true")
buildConfigField "String", "SERVER_HOST", "\"200.200.200.50/\""
minifyEnabled true//true:启用混淆,false:不启用
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
shrinkResources false
zipAlignEnabled true
pseudoLocalesEnabled true
signingConfig signingConfigs.release
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
assets.srcDirs = ['assets']
java.srcDirs = ['src']
res.srcDirs = ['res']
jniLibs.srcDirs = ['libs']
}
}
lintOptions {
abortOnError false
}
/* buildTypes{
debug{
signingConfig signingConfigs.HetConfig
}
release {
signingConfig signingConfigs.HetConfig
}
}*/
}
//微信资源混淆工具
andResGuard {
mappingFile = null
use7zip = true
keepRoot = false
// add <yourpackagename>.R.drawable.icon into whitelist.
// because the launcher will get the icon with his name
whiteList = [
"andresguard.tencent.com.andresguard_example.R.drawable.icon",
//https://docs.fabric.io/android/crashlytics/build-tools.html
"andresguard.tencent.com.andresguard_example.R.string.com.crashlytics.*"
]
compressFilePattern = [
"*.png",
"*.jpg",
"*.jpeg",
"*.gif",
"resources.arsc"
]
//修改成本地SDK中zipalign路径
// zipAlignPath = '/Users/sun/Library/Android/sdk/build-tools/21.1.1/zipalign'
zipAlignPath = ' D:\\eclipse\\all_adt-bundle-windows-x86_64-20140321\\adt-bundle-windows-x86_64-20140321\\sdk\\build-tools\\21.1.1\\zipalign'
//替换成本地7zip路径
//sevenZipPath = '/usr/local/bin/7za'
sevenZipPath = 'D:\\2345Soft\\7zip\\7-Zip\\7z'
}
dependencies {
compile fileTree(dir: 'compile-libs', include: '*.jar')
// provided files('../csleep/libs/butterknife-5.1.2.jar')
compile fileTree(dir: 'libs', include: '*.jar')
provided files('../CommonBusiness/build/intermediates/bundles/release/classes.jar')
// provided files('../CommonResource/build/intermediates/bundles/release/classes.jar')
compile project(':CLifeAsr')
compile project(':csleep')
compile project(':CommonResource')
provided files('../ShareSDK/libs/libammsdk.jar')
provided files('../ShareSDK/libs/open_sdk.jar')
provided files('../CommonBusiness/libs/eventbus.jar')
// configurations {
// all*.exclude group: 'com.android.support', module: 'support-v4'
// }
compile('com.crashlytics.sdk.android:crashlytics:2.5.2@aar') { transitive = true; }
}
这个build.gradle只是自己项目中用到的,肯定没有包含所有,也没有哪个项目会在build.gralde中把所有东西都用到。这里只想起个抛砖引玉的作用,这里没有的,google上肯定可以查到的。
下面就只说说build.gradle 中buildTypes中的buildConfigField的作用。
如上:
buildConfigField("boolean", "LOG_DEBUG", "true")
buildConfigField "String", "SERVER_HOST", "\"200.200.200.50/\""
1
2
看下groovy中的源码:
/**
* Adds a new field to the generated BuildConfig class.
*
* <p>The field is generated as: <code><type> <name> = <value>;</code>
*
* <p>This means each of these must have valid Java content. If the type is a String, then the
* value should include quotes.
*
* @param type the type of the field
* @param name the name of the field
* @param value the value of the field
*/
public void buildConfigField(
@NonNull String type,
@NonNull String name,
@NonNull String value) {
ClassField alreadyPresent = getBuildConfigFields().get(name);
if (alreadyPresent != null) {
logger.info(
"BuildType(${getName()}): buildConfigField '$name' value is being replaced: ${alreadyPresent.value} -> $value");
}
addBuildConfigField(AndroidBuilder.createClassField(type, name, value));
}
一目了然,这个方法接收三个非空的参数,第一个:确定值的类型,第二个:指定key的名字,第三个:传值
上面的意思是:为LOG_DEBUG = true
那这个值怎么读取呢?在Groovy中,直接由BuildConfig类点出key名来取值,如下:
if(BuildConfig.LOG_DEBUG){
//Debug,打印日志
Logger.init("AppPlusLog").setLogLevel(LogLevel.FULL);
}else{
//release,关闭日志
Logger.init("AppPlusLog").setLogLevel(LogLevel.None);
}
同样的,网络切换也可以这样设置
buildConfigField "String", "SERVER_HOST", "\"200.200.200.50/\""
//取值
String host = BuildConfig.SERVER_HOST;
//然后再把这个host替换掉默认的那个
---------------------
Gradle 中 buildConfigField的巧妙应用的更多相关文章
- gradle中使用嵌入式(embedded) tomcat, debug 启动
在gradle项目中使用embedded tomcat. 最开始部署项目需要手动将web项目打成war包,然后手动上传到tomcat的webapp下,然后启动tomcat来部署项目.这种手动工作通常还 ...
- 在Gradle中使用jaxb的xjc插件
jaxb,全称为Java Architecture for Xml Binding,是一种将java对象与xml建立起映射的技术.其主要提供两个功能,一是将java对象映射为xml,二是将xml映射为 ...
- Gradle中的buildScript代码块
在编写Gradle脚本的时候,在build.gradle文件中经常看到这样的代码: build.gradle 1 2 3 4 5 6 7 8 9 buildScript { repositories ...
- Gradle中使用idea插件的一些实践
如果你的项目使用了Gradle作为构建工具,那么你一定要使用Gradle来自动生成IDE的项目文件,无需再手动的将源代码导入到你的IDE中去了. 如果你使用的是eclipse,可以在build.gra ...
- [转] Gradle中的buildScript代码块
PS: 在build script中的task apply plugin: 'spring-boot' 需要 classpath("org.springframework.boot:spri ...
- gradle中使用cobertura做代码覆盖(转)
gradle很好用,但是默认是没有代码覆盖功能的,只好自己写.曾经在网上找到过别人的一段脚本,虽然也能用,但是有一些不爽的地方,一个原因是它不支持对层级工程中全部代码的覆盖,另一个原因是它用替换bui ...
- Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- Gradle中的闭包
Gradle是基于Groovy的DSL基础上的构建工具,Gradle中的闭包,其原型上实际上即Groovy中闭包.而在表现形式上,其实,Gradle更多的是以约定和基于约定基础上的配置去展现.但本质上 ...
- 在 Gradle 中使用 MyBatis Generator
在 Intellij IDEA 中结合 Gradle 使用 MyBatis Generator 逆向生成代码 Info: JDK 1.8 Gradle 2.14 Intellij IDEA 2016. ...
随机推荐
- asp.net core2.0大白话带你入门
本系列包括: 1.新建asp.net core项目2.web项目目录解读3.配置访问地址4.环境变量详解5.配置文件6.日志7.DI容器8.服务的生命周期9.session的使用10.cookie的使 ...
- 【noip模拟赛4】找啊找啊找BF 拓扑排序
描述 sqybi上次找GF的工作十分不成功,于是依旧单身的他在光棍节前的某天突发奇想,要给自己找一个BF(这里指的是男性的好朋友……),这样既可以和人分享内心的压抑(路人甲:压抑还分享么……),也可以 ...
- Linux- Showdown 命令详解
语法 shutdown(选项)(参数) [选项] -c:当执行"shutdown -h 11:50"指令时,只要按+键就可以中断关机的指令: -f:重新启动时不执行fsck: -F ...
- 030.Zabbix分布式部署
一 分布式Zabbix介绍 zabbix proxy 可以代替 zabbix server 收集性能和可用性数据,然后把数据汇报给 zabbix server,并且在一定程度上分担了zabbix se ...
- [软件研究]对wdcp v3的一次小研究#1
0x00 前言 好久没有更新了,已经长草无疑. 之前团队要搞个测验的系统,用来安全培训考核,团队内又没啥人搞开发的,自己又想学一下vue,就用vue+ci 撸了一个. 搞了一个星期基本搞完(开发能力真 ...
- Spring 注解@Transactional readOnly=true
引子 今天下班后,以前同事小胖问我Spring Service类中的注解@Transactional readOnly=true的作用.做为他眼中的高人,我自然要装下A-C.居然想都没有想就说是注解 ...
- MongoDB--集群
为什么需要集群 为了让数据安全 高(24* 7)数据可用性 灾难恢复 无停机维护(如备份,索引重建,压实) 读缩放(额外的副本读取) 副本集对应用程序是透明 设置集群 准备工作 在MongoDB的集群 ...
- 汉化 android studio
Analyze APK...android.jar\com\android\tools\idea\apk\viewer AnalyzeApkAction.class
- gradle 汉化
作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com E-mail: 313134555 @qq.com gradle 汉化 android stud ...
- swoole深入学习 1. swoole初始
0. 前言 swoole在PHP圈火了这么久,从2年前我用node写socket聊天服务器的时候就火了,那时候,经常有类似的文章php+swoole完爆nodejs之类的文章来吸引眼球,先不说它的好与 ...