理解与配置android studio中的gradle
Posted 阳光玻璃杯
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解与配置android studio中的gradle相关的知识,希望对你有一定的参考价值。
使用gradle构建android应用时,你总是需要这样一个文件:build.gradle。你应该已经看过这个文件了,如果没有看过的话,你现在就可以看一下,它没有多少内容。它的简洁性得益于它提供了很多对设置和属性的默认值。gradle是基于groovy语言的,不过如果只是用它构建普通的工程的话,是可以不去学groovy的,如果想深入的做一下自定义的构建插件,可以考虑学一下groovy,因为它是基于java的,所以你有java基础的话,学习不会很难。
这篇博客旨让任何一个人能看懂android studio的gradle scripts,主要会从gradle的简单语法,gradle scripts的脚本结构,每一个脚本(build.gradle,settings.gradle)的作用,脚本中每一项的意义等方面说明gradle scripts.如果想了解如何详细配置gradle,比如实现一个工程中,使用同一部分java代码,不同的资源res,一次生成多个不同渠道商的apk,可以看下我的这篇博客,它对如何配置gradle有较细致的介绍:详细配置android studio中的gradle
1.projects , tasks and action
是的,工程,任务和行为。一个项目至少要有一个工程,一个工程至少要有一个任务,一个任务由一些action组成。如果project比较抽象的话,可以这么理解,一个build.gradle对应一个project,而action就好像java中的方法,他就是一段代码的集合。在工程构建的过程中,gradle会根据build.gradle中的配置信息生成相应的project和task。
Project实质上是一系列task的集合,每一个task执行一些工作,比如编译类文件,解压缩文件,删除文件等等。
1.1构建过程
1.1.1初始化阶段。首先会创建一个Project对象,然后执行build.gradle配置这个对象。如果一个工程中有多个module,那么意味着会有多个Project,也就需要多个build.gradle.
1.1.2配置阶段。这个阶段,配置脚本会被执行,执行的过程中,新的task会被创建并且配置给Project对象。
1.1.3执行阶段。这个阶段,配置阶段创建的task会被执行,执行的顺序取决于启动脚本时传入的参数和当前目录。
1.2 task
task标示一个逻辑上的执行单元,你可能已经用过它很多次了,不知道你有没有意识到。当你当你重新编译工程的时候,会用到一个叫做build 的task,当你清理工程的时候,会用到一个叫做clean 的task(后面会讲到),gradle 已经为你准备了很多的task,可以使用 gradle tasks 来查看,比如,这里列出来一些:
assemble - Assembles all variants of all applications and secondary packages.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
clean - Deletes the build directory.
此外,你还可以自己声明一个task,比如像这样:
task haha {
println "haha"
}
然后使用gradle haha命令,就会打印出haha。这里,haha这个任务被执行了,所以说task就是个执行单元。你还可以使用如下方法来定义task:
task hello << {
println "hello world"
}
这和前者是有区别的,“<<”意思是给hello这个task添加一些action,其实就是调用了task的doLast方法,所以,它和以下代码时等价的:
task hello {
doLast{
println "hello world"
}
}
关于haha 和 hello的区别,你还可以这样加深影响:
首先,进入到你的工程目录,执行gradle (后面没有任何参数,另外,这个时候,build.gradle中同时有hello 和 haha 两个tasks),结果如下:
E:\\android\\androidwork2.0\\GradleTest>gradle
haha
Incremental java compilation is an incubating feature.
:help
Welcome to Gradle 2.13.
To run a build, run gradle <task> ...
To see a list of available tasks, run gradle tasks
To see a list of command-line options, run gradle --help
To see more detail about a task, run gradle help --task <task>
BUILD SUCCESSFUL
Total time: 21.877 secs
E:\\android\\androidwork2.0\\GradleTest>gradle tasks
可以按到haha,被打印了,而hello没有被打印,注意,这个时候默认执行的task 是help,也就是说并没有执行haha 这个task,可它还是被打印了,就说明使用定义haha 这种方式定义的task在初始化阶段就会被执行,而使用定义hello这种方法定义的task在执行阶段才会被执行。
在android studio的顶层build.gradle中有这样一个task:
可以看到这个task有一个类型type,task有很多种类型的,以下列出来一些:task clean(type: Delete) { delete rootProject.buildDir }
这里用到了delete类型,task的类型可以这样理解吧:task中文就是任务,任务有很多种类,Delete就是说这是个删除文件的任务。
这里就不更深入的探讨task了,这些类容已经可以使我们可以理解android studio中遇到的内容了。
2.Closures
2.1 定义闭包
以上是关于理解与配置android studio中的gradle的主要内容,如果未能解决你的问题,请参考以下文章
[转]第一次使用Android Studio时你应该知道的一切配置:gradle项目构建