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中生成的字段去控制就灵活多了.