Gradle概述
gradle 主要是用来构建项目的 gradle由三个部分组成
- groovy核心语法
- build script block
- gradle api
相对于maven,ant,gradle在灵活性、粒度性、兼容性上要强很多
1.gradle生命周期
/**
* 配置阶段开始前的监听回调
*/
this.beforeEvaluate {
println '配置即将开始...'
}
/**
* 配置阶段完成以后监听回调
*/
this.afterEvaluate {
println '配置阶段执行完毕...'
}
/**
* gradle执行完毕监听回调
*/
this.gradle.buildFinished {
println '执行阶段执行完毕...'
}
//同beforeEvaluate
this.gradle.beforeProject {}
//同afterEvaluate
this.gradle.afterProject {}
输出如下
2. project 核心 API
2.1 getAllprojects()获取所有project
getSubprojects()获取子project
项目根目录下build.gradle敲以下代码
this.getProjects()
def getProjects(){
println '----------'
println 'Root Project'
println '----------'
this.getAllprojects().eachWithIndex{ Project project, int index ->
if(index == 0){
println "Root project ':${project.name}'"
}else{
println "+--- project ':${project.name}'"
}
}
}
//Terminal下 ./gradlew clean 命令 输出
// ----------
//Root Project
//----------
//Root project ':DSH_JAVA'
//+--- project ':app'
//+--- project ':libmodule'
2.2 getParentProject() module工程下build.gradle敲击以下代码
//获取父project
this.getParentProject()
def getParentProject(){
def name = this.getParent().name
println "the parent project name is:${name}"//the parent project name is:DSH_JAVA
}
2.3 getRootProject() 获取根project
this.getRootPro()
def getRootPro(){
def name = this.getRootProject().name
println "the root project name is:${name}"//the root project name is:DSH_JAVA
}
2.4 通过project() 可以在根目录下为所有子工程进行配置
//通过project() 可以在根目录下为所有子工程进行配置
project('app'){Project project ->
apply plugin:'com.android.application'
version '1.0.0-release'
group 'com.java.dsh'
android{}
dependencies {}
}
project('libmodule'){
apply plugin: 'com.android.library'
group 'com.java.dsh'
android{}
dependencies {}
}
2.5 为整个工程配置(当前节点project和所有subprojects)
allprojects {
group 'com.dsh.java'
version '1.0.0-release'
repositories {
google()
jcenter()
}
}
2.6 subprojects()为所有子工程进行配置
//subprojects() 子工程
//不包括当前节点工程,只包括它的subproject
subprojects {
//子工程中的库工程推送到maven
if (project.plugins.hasPlugin('com.android.library')) {
apply from '../publishToMaven.gradle'
}
}
3. 属性相关API
3.1 ext 拓展属性
①在项目根目录下新建config.gradle
//ext+闭包 扩展属性
ext{
compileSdkVersion = 28
//定义一个map
android = [
versionCode : 100,
versionName : "1.0.0",
]
}
②在根目录build.gradle中引入onfig.gradle
apply from: "config.gradle"
//或者
apply from: this.file("config.gradle")
③然后在子工程目录build.gradle中使用拓展属性
apply plugin: 'com.android.application'
android {
//config.gradle 扩展属性 ext
// compileSdkVersion this.rootProject.ext.compileSdkVersion
// 也可以直接调用
compileSdkVersion this.compileSdkVersion
defaultConfig {
applicationId "com.dsh.java"
minSdkVersion 19
targetSdkVersion 28
versionCode this.rootProject.ext.android["versionCode"]
versionName this.rootProject.ext.android["versionName"]
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
3.2 gradle.properties 拓展属性
①gradle.properties中添加如下代码
enableLib = true
applicationId = com.dsh.java
②根目录下settings.gradle中配置模块加载
include ':app'
//通过gradle.properties中enableLib属性 配置libModule是否加载
if (hasProperty('enableLib')?enableLib.toBoolean():false){
include ':libmodule'
}
③子工程build.gradle中直接使用applicationId属性
defaultConfig {
applicationId applicationId
...
}
3.3 文件操作api
①获取路径
//1. 获取路径
println 'the root file path is:'+getRootDir().absolutePath
println 'the build file path is:'+getBuildDir().absolutePath
println 'the project file path is:'+getProjectDir().absolutePath
②定位文件
//2. file 定位文件
println getContent('README.md')
def getContent(String path){
try {
//file 定位一个文件 相对于当前的project工程开始查找无需传入绝对路径
def file = file(path)
return file.text
} catch (GradleException e) {
println 'file not found'
}
}
③拷贝文件
//3. copy拷贝
copy {
from file('build/outputs/apk')
into getRootProject().getRootDir().path +"/apl/"
exclude {}
rename {}
}
④对文件树遍历
//4. 对文件树进行遍历 以及拷贝
fileTree('app/build/outputs/logs/'){FileTree fileTree ->
fileTree.visit {FileTreeElement element ->
println 'the file name is : '+element.file.name
copy {
from element.file
into getRootProject().getRootDir().path+'/test/'
}
}
}
4.依赖相关api
4.1 buildscript
根目录build.gradle中的配置
buildscript { ScriptHandler scriptHandler ->
//配置工程的仓库地址
repositories {
google()
jcenter()
maven{//配置maven仓库
name "${name}"
url "${url}"
credentials {
username = 'joe'
password = 'secret'
}
}
}
//配置工程的"插件"依赖地址
dependencies {
classpath 'com.android.tools.build:gradle:3.2.1'
}
}
4.2 dependencies
子工程app目录下build.gradle中的配置
//为应用程序添加第三方依赖
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
implementation ('com.xxxxxx.sdk:1.0.0'){
exclude module:'picture_edit'//排除依赖
transitive false //传递依赖 false 禁止,尽量不使用
}
provided 'xxx' //占位编译,编译时起作用,运行时不起作用,可以减少输出包大小
}
5. Task
5.1执行外部命令
app/build.gradle 下添加apk复制task,终端下输入.gradlew apkcopy执行命令
//5 执行外部命令
task apkcopy(name:'apkcopy'){
doLast {
//gradle的阶段去执行
def sourcePath = this.buildDir.path+'/outputs/apk'
def desationPath = getRootProject().getRootDir().path+'/test/'
def command = "mv -f ${sourcePath} ${desationPath}"
exec{
try {
executable 'bash'
args '-c',command
println 'the command is execute success'
} catch (GradleException e) {
println 'the command is execute failed'
}
}
}
}