美文网首页
Gradle 学习

Gradle 学习

作者: Lost_Robot | 来源:发表于2017-12-07 14:22 被阅读20次

1.定义

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置[DSL 全称是Domain Specific Language,即“特定领域的语言”,其实就是这个语言不通用,只能用于特定的某个领域,俗称“小语言”],支持maven, Ivy仓库,支持传递性依赖管理,抛弃了基于XML的各种繁琐配置。

面向Java应用为主。当前其支持的语言限于Java、Groovy、Kotlin和Scala,计划未来将支持更多的语言。

2.与Ant和Maven的区别

Ant和Maven都是基于XML的构建工具,Gradle是用Groovy编写的构建工具。
Groovy是JVM衍生的与JAVA语法高度兼容的动态强类型语言。

Ant:编写容易,但功能有限,需要人工操作的过程也多;

Maven:依托于庞大的依赖仓库,因此有着强大的外部依赖管理,但添加本地依赖并不方便,且项目不能灵活修改。

Gradle:能很好地结合Ant与Maven各自的优点,可以随意的编写任务并组合成项目,直接利用Maven仓库,并且能很好的支持传递依赖和内部依赖。(本部分为个人主观意见,可能与大多数人的意见并不相同)

Gradle通过编写一个名为build.gradle的脚本文件对项目进行设置,再根据这个脚本对项目进行构建(复杂的项目也有其他文件)

Gradle 脚本本质上就是Groovy脚本,只不过高度利用了groovy的语法糖,例如省略方法参数括号和省略句尾分号等,让代码看起来像DSL。
所以几乎所有java和groovy支持的语法,它的脚本都支持。(使用JAVA和GROOVY的SDK应该也是没问题的)

Gradle支持基于惯例的构建,并有丰富的适合不同情景下的插件库,光有官方用户手册支持的就有20多种,方便构建。

3.Gradle里有两个基本概念:项目(projects)和任务(tasks)

1.项目(projects):

项目由多个任务组成,一个项目可以理解为提供给不同设备的构建版本,如桌面版、网页版、安卓版、iOS版等等,也可以理解为一种行为,例如部署应用到生产环境。

2.任务(tasks):

任务相当于Ant的target,可以理解成一个构建中原子性的工作,例如编译、打包、执行等。需要注意的是,Ant中他自己的命令例如javac、copy等也叫做task,但Ant的task远没有Gradle的task那么自由。

每个项目的编译至少有一个 Project,一个 build.gradle就代表一个project,每个project里面包含了多个task,task 里面又包含很多actionaction是一个代码块,里面包含了需要被执行的代码。

Gradle 的编译周期
在编译过程中, Gradle 会根据 build 相关文件,聚合所有的project和task,执行task 中的 action。因为 build.gradle文件中的task非常多,先执行哪个后执行那个需要一种逻辑来保证。这种逻辑就是依赖逻辑,几乎所有的Task 都需要依赖其他 task 来执行,没有被依赖的task 会首先被执行。所以到最后所有的 Task 会构成一个 有向无环图(DAG Directed Acyclic Graph)的数据结构。

编译过程分为三个阶段:

  • 初始化阶段:创建 Project 对象,如果有多个build.gradle,也会创建多个project.
  • 配置阶段:在这个阶段,会执行所有的编译脚本,同时还会创建project的所有的task,为后一个阶段做准备。
  • 执行阶段:在这个阶段,gradle 会根据传入的参数决定如何执行这些task,真正action的执行代码就在这里.

Gradle 项目文件说明:

1. 项目的配置文件build.gradle配置文件:

文件的配置最终会被应用到所有项目中。

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {//定义了 Android 编译工具的类路径。
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {  //中定义的属性会被应用到所有 module 中,但是为了保证每个项目的独立性,我们一般不会在这里面操作太多共有的东西。
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

2. settings.gradle配置文件:
定义了哪些module 应该被加入到编译过程,对于单个module 的项目可以不用需要这个文件,但是对于 multimodule 的项目我们就需要这个文件,否则gradle 不知道要加载哪些项目。这个文件的代码在初始化阶段就会被执行。

include ':app'

3. Module app的build.gradle配置文件:

apply plugin: 'com.android.application'  //应用了Android 程序的gradle插件,作为Android 的应用程序,这一步是必须的,因为plugin中提供了Android 编译、测试、打包等等的所有task。

android {//这是编译文件中最大的代码块,关于android 的所有特殊配置都在这里,这就是又我们前面的声明的 plugin 提供的。 
    compileSdkVersion 25
    buildToolsVersion "27.0.1"

//就是程序的默认配置,注意,如果在AndroidMainfest.xml里面定义了与这里相同的属性,会以这里的为主。
    defaultConfig {
        applicationId "com.example.libra.myapplication"  //包名,作为程序的唯一识别ID,防止在同一手机装两个一样的程序;以前在manifest中还会作为我们R资源类的包名,现在不在作为R文件的包名了。
        minSdkVersion 15  //支持最小的android系统版本
        targetSdkVersion 25  //这是该应用针对的目标SDK版本
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    buildTypes {//定义了编译类型,针对每个类型我们可以有不同的编译配置,不同的编译配置对应的有不同的编译命令。默认的有debug、release 的类型。
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {//是属于gradle 的依赖配置。它定义了当前项目需要依赖的其他库。
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.squareup.okhttp3:okhttp:3.3.0'
    compile 'com.squareup.okio:okio:1.8.0'
    testCompile 'junit:junit:4.12'
}

repositories{
    mavenCentral()
}

Gradle 项目配置文件

4.Gradle的构建:

Gradle的构建分两个阶段
第一阶段是设置阶段(configuration phase),分析构建脚本,处理依赖关系和执行顺序等,脚本本身也需要依赖来完成自身的分析。

第二阶段是执行阶段(execution phase),此阶段真正构建项目并执行项目下的各个任务。

5.为甚要学习Gradle

Gradle是目前Android主流的构建工具,不管你是通过命令行还是通过AndroidStudio来build,最终都是通过Gradle来实现的。所以学习Gradle非常重要。

目前国内对Android领域的探索已经越来越深,不少技术领域如插件化、热修复、构建系统等都对Gradle有迫切的需求,不懂Gradle将无法完成上述事情。所以Gradle必须要学习。

相关文章

网友评论

      本文标题:Gradle 学习

      本文链接:https://www.haomeiwen.com/subject/zcydixtx.html