所谓好记性不如赖笔头今天记一下gradle的一点基础知识。
一:基础
gradle是Android开发中的项目构建系统,其特点如下:
1. 打包、签名与发布方便
2. 使用领域驱动语言(DSL)来描述构建逻辑,构建脚本使用Groovy
3. 内建的依赖管理系统,使用Maven或者Ivy
看一个最简单的Android项目build.gralde
buildscript {
repositories {
//使用maven中央仓库构建代码
mavenCentral()
}
dependencies {
//gradle插件版本号:
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
apply plugin: 'android'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
androidTest {
manifest.srcFile 'tests/AndroidManifest.xml'
java.srcDirs = ['tests/src']
resources.srcDirs = ['tests/src']
aidl.srcDirs = ['tests/src']
renderscript.srcDirs = ['tests/src']
res.srcDirs = ['tests/res']
assets.srcDirs = ['tests/assets']
}
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.release
}
debug {
debuggable true
minifyEnabled false
signingConfig signingConfigs.release
}
alpha {
debuggable true
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
}
}
dependencies {
//本地libs目录依赖模式:
compile fileTree(dir: 'libs', include: '*.jar')
//本地项目依赖模式:
compile project(':Library')
//远程依赖模式:
compile 'com.android.support:support-v4:19.+'
compile 'com.android.support:appcompat-v7:19.+'
compile 'com.android.support:recyclerview-v7:+'
compile 'com.jakewharton:butterknife:6.1.0'
compile 'de.greenrobot:eventbus:2.4.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'
compile 'com.squareup.dagger:dagger:1.2.2'
apt 'com.squareup.dagger:dagger-compiler:1.2.2'
}
上面的代码中就声明了我们的构建程序会使用Maven中央仓库。
buildscript { ... } 配置驱动构建过程的代码,意思就是buildscript中的配置仅仅在构建过程中起作用,也就是构建程序所使用的配置。
apply plugin: 'android' 是指使用Android插件。
android { ... } 配置了Android项目构建时需要的所有参数。
sourceSets { ... } 指项目的目录结构
buildTypes{ ... } 指项目的编译版本类型
minifyEnabled 是否混淆
proguardFiles 混淆规则文件
debuggable 可否调试
signingConfig 签名类型
dependencies { ... } 指项目所依赖的库
二:提高
Gradle脚本是使用Groovy语言来写的,Groovy中有一个很重要的概念你必要要弄懂–Closure(闭包)。从 从 C/C++ 语言的角度看 , 闭包和函数指针很像,如果闭包没定义参数的话 , 则隐含有一个参数 ,叫 这个参数名字叫 it ,和 和 this 的作用类
似 。
Closure 的定义格式是:
defClosure = {paramters -> code} //或者
def Closure = {无参数,纯 code} 这种情况不需要->符号
例如:
def closure = {// 闭包是一段代码 , 所以需要用花括号括起来..
String param1, int param2 -> //箭头很关键。前面是参数定义,后面是代码
println "this is code" //这是代码,最后一句是返回值,
}
Closure可以当做参数传递,把closure当做参数传递有以下几种语法规则:
1.只接收一个参数,且参数是closure的方法: myMethod(myClosure)
2.如果方法只接收一个参数,括号可以省略: myMethod myClosure
3.可以使用内联的closure:myMethod {println‘Hello World’} //gradle中常见的写法
4.接收两个参数的方法: myMethod(arg1, myClosure)
5.和4类似,单数closure是内联的: myMethod(arg1, { println ‘Hello World’ })
6.如果最后一个参数是closure,它可以从小括号从拿出来: myMethod(arg1) { println ‘Hello World’ }
这个特点非常关键,因为以后在 Gradle 中经常会出现图 7 这样的代码:
buildscript { ... }
android { ... }
sourceSets { ... }
这样再回过头去看gradle就很容易理解了。