gradle 编译脚本简单理解
-
关于as下两个gradle.build文件的作用这里就不再次介绍,详见博客内容即可
-
今天主要针对gradle构建脚本的一些变量以及参数进行介绍,一步一步从初始项目构建进行分析,方便以后为自己的项目编写构建脚本
-
构建目录
image.png新建创建的android studio项目会有以下几个目录,从上到下以此看
gradle // 由gradle编译插件自动产生的文件,该目录内容一般不需要care,且无需进行代码管理
2. .idea // IDEA 运行时候生成的文件目录,一般情况不做修改,同样不需要纳入项目源代码管理中 3.app // 项目module模块,其中每一个module可看成在Eclipse中的一个Project,包含项目的源代码 4.build // 包含项目编译所产生的中间文件
5.gradle // wrapper目录下有两个文件,里面有一些项目对gradle的配置信息,具体配置说明详见我wiki中的博客,这里不再次介绍
6. .gitignore // 对项目文件进行管理,可以在里面配置不希望纳入git管理的文件,其中默认已经为我们定义了一些规则
image.png7.build.gradle // 今天将要介绍的核心文件之一,内容如下
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.2' //
NOTE: Do not place your application dependencies
here; they belong
// in the individual module build.gradle files }
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这里是对整个project进行配置,这里要与module中的build.gradle进行区分,使用的场景一般多为,当一个android项目有多个module时,可以在allproject中进行统一的配置,在整个工程下的build.gradle配置的内容会优先于app下的builde.gradle进行使用。验证如下:
首先,在project下的build.gradle进行配置整个andriod编译24版本等信息
image.png
然后,在app下的build.gradle中我们使用23版本
image.png
此时,当重新syn项目时,发现出错,且默认使用的是24版的sdk
image.png
- 自定义gradle task
-
gradle task即是在treminal使用gradle + [task名称] 执行的一段函数程序,以第一次创建的工程为例,如上图,会默认在project下的builde.gradle 文件中 默认为我们定义一个task
task clean(type: Delete) {
delete rootProject.buildDir}
当我们在terminal中执行gradle clean时,就会执行这段逻辑,但是删除的rootProject.buildDir是哪个文件夹呢?这里我们可以使用 println 对该路径进行打印task clean(type: Delete) {
delete rootProject.buildDir println "clean 完成" }
-
打印结果 /Users/baidu/MyApplication/build 即是当我们执行gradle assembleDebug时,产生的文件目录
-
自定义一个task
- 在我们的project路径下的build.gradle中增加一段task用来打印rootProject中的一些变量
task echoAll(){
println rootProject.buildDir println rootDir println rootProject.rootDir println "echoAll打印 完成" }打印结果 /Users/baidu/MyApplication/build /Users/baidu/MyApplication /Users/baidu/MyApplication echoAll打印 完成
-
为了验证project中build.gradle和app下的builde.gradle的执行顺序,我们复制这段task到app下的build.gradle中
task echoAll(){
println rootProject.buildDir println rootDir println rootProject.rootDir println "echoAllInApp打印 完成" }执行gradleechoAll,发现两端同样名称的task都会执行到,且project下的执行优先于app下的task
image.png
- 那么,什么时候用projecrt下什么时候用app下的呢?使用场景同样可以看我之前写的博客两种的区别
- 一般的使用场景即是当我们的一个project中有多个module时,在project中配置多个module共同使用的一些参数变量,比如可以在project的builde.gradle文件中增加SDK版本等信息
-
首先,增加ext参数,即是定义一些变量,在gradle脚本中进行使用
image.png -
在app下builde.gradle使用该变量,通过rootProject对象去找相应的变量
image.png
-
- 另外一种定义全局变量的方式,将全局变量放到一个指定的gradle文件中进行管理,在project下builde.gradle中去引用,app下的builde.gradle进行使用
-
首先,在整个项目目录下创建一个script文件夹用于管理要定义的全局gradle变量文件
image.png - 在project目录中的builde.gradle文件开始增加
apply from : "script/config.gradle" // 文件目录
-
- 一般的使用场景即是当我们的一个project中有多个module时,在project中配置多个module共同使用的一些参数变量,比如可以在project的builde.gradle文件中增加SDK版本等信息
* 在app下的builde.gradle中使用
image.png
-
setting.gradle
这个文件定义了哪些module 会被加入到编译过程,对于单个module 的项目可以不用编辑这个文件,但是对于 multimodule 的项目我们就需要这个文件,否则gradle 不知道要加载哪些项目。这个文件的代码在初始化阶段就会被执行。