Android项目中都有build.gradle文件,其实这是gradle构建工具,gradle是由Groovy语言开发的,之前只是把简单的语法学习了下,由于要找工作 没时间学习了,如果能找到工作 上班后再学习,也有可能这辈子就离开it了,
Gradle核心是基于Groovy脚本语言的,Groovy脚本是基于java意思是它完全的兼容jvm,而且还在此基础上做了扩展,因此Gradle需要jdk和Groovy库.
之前的构建工具有ant maven这二个是基于xml的,
比如我在项目的目录下打印hello gradle
apply plugin: 'com.android.application'
println("hello gradle")
然后点击同步或者builde项目
这就是groovy脚本语言,如果学过groovy脚本语言的知道 它是个弱语言,不像Java那样,其实上面的打印这样写也是对的,
println "hello gradle"
不用()也可以的
现在我创建一个Android library然后也打印出一句话 看是否有输出
apply plugin: 'com.android.library'
println "hello library"
然后点击同步
> Configure project :app
hello gradle
> Configure project :library
hello library
发现也打印出来了
我们发现你在app的build.gradle libray中的build gradle都是可以打印出来字符串的,那么如果是打印一个变量,这个变量统一管理,就很好了,这是可以的.
在项目的根目录下创建一个config.gradle 文件
创建完后它是一个空文件,现在config.gradle文件中写入这行代码
ext{
userName = "zhouguizhi"
age=18
}
ext:表示添加多个自定义属性,就使用ext代码块,类似Java同步的synchronized代码块
userName表示属性名。zhouguizhi表示属性值
那么在app或者library中的build.gradle使用到呢?那就要把这个config.gradle在根目标的build.gradle进行配置,如下
现在分别在app和library中打印出config.gradle的自定义属性
apply plugin: 'com.android.application'
println "${userName}"
apply plugin: 'com.android.library'
println "${age}"
同步下代码
> Configure project :app
zhouguizhi
> Configure project :library
18
都把对应的属性值打印出来了,当然上面的是简写,还可以使用这种方式
println "${rootProject.ext.userName}"
上面的写法是缩写,从这点也可以看的出来groovy语言是一门弱语言,比如我在打印之前还可以重新对这个属性进行赋值操作
apply plugin: 'com.android.application'
rootProject.ext.userName = "app"
println "${rootProject.ext.userName}"
这个打印出来的就是字符串app了,当然你还可以赋值一个int类型给它都是可以的,这有点像js中的var修饰的变量
比如真实的项目开发中可能有很多个module,比如
compileSdkVersion 28
buildToolsVersion "29.0.0"
minSdkVersion 15
targetSdkVersion 28
还有依赖库的版本都希望统一管理,如果修改的话 改一处就行了,这就相当于Java中的封装了,不就很好了,
我们现在就做一个全局的配置,这样不管在哪个build.gradle文件都是用同一份
config.gradle
ext{
isRelease = true
androidId=[
compileSdkVersion:28,
buildToolsVersion:"29.0.0",
minSdkVersion: 15,
targetSdkVersion: 28,
versionCode: 1,
versionName: "1.0"
]
appId=[
applicationId: "com.example.gradle",
]
url=[
debug:"http://www.baidu.com",
release:'http://qq.com'
]
supportLibrary = '28.0.0'
support=[
appcompat:"com.android.support:appcompat-v7:${supportLibrary}",
constraint: "com.android.support.constraint:constraint-layout:1.1.3"
]
}
在build.gradle使用
apply plugin: 'com.android.application'
def androidId=rootProject.ext.androidId
def appId = rootProject.ext.appId
def support = rootProject.ext.support
android {
compileSdkVersion androidId.compileSdkVersion
buildToolsVersion androidId.buildToolsVersion
defaultConfig {
applicationId appId.applicationId
minSdkVersion androidId.minSdkVersion
targetSdkVersion androidId.targetSdkVersion
versionCode androidId.versionCode
versionName androidId.versionName
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation support.appcompat
implementation support.constraint
}
上面的def就是类型定义变量的关键词
我们开发可能对这个类BuildConfig不会陌生,这是系统帮我们生成的,不管是app还是library都有这个类,这个类的所在目录是
看看这个类都有啥
package com.example.gradle;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.gradle";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
那如何写入一个变量到这个类中呢,肯定不是直接在这里面写,你也写不了,在build.gradle文件中这个位置
buildTypes {
debug{
buildConfigField("String","debug","\"${url.debug}\"")
}
release {
buildConfigField("String","release","\"${url.release}\"")
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
我现在写入了这段话,然后同步下 rebuild下看看BuildConfig类
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.gradle";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
// Fields from build type: debug
public static final String debug = "https://www.baidu.com";
}
比如我们在项目中打log,在release版本希望把这个log关闭,一般都写个工具类 ,自己去控制,而如果添加buildConfigField属性从而在BuildConfig中生成的字段去控制就灵活多了.