Gradle 入门详解

Java 作为一门世界级主流编程语言,有一款高效易用的项目管理工具是 Java 开发者想要的。先是 2000 年的 Ant,后有 2004 年 Maven 的诞生,都在 Java 市场上取得了巨大的成功。但二者都有一定的不足和局限性。

2012年基于 Ant 和 Maven 产生的 Gradle,弥补了 Ant 和 Maven 的不足,带来了一些更高效的特点。它使用了一种更高效的特点。它使用一种基于 Groovy 的特定领域语言(DSL)来声明项目设置,抛弃了基于 XML 的各种繁琐配置。

Gradle是什么?

Gradle是一个基于 Apache AntApache Maven 概念的项目自动化构建工具。它使用一种基于 Groovy 的特定领域语言来声明项目设置,而不是传统的 XML。当前其支持的语言限于 JavaGroovyScala,计划未来将支持更多的语言。

可能刚接触 Gradle 的同学都不是很了解 Gradle 的这个定义。可能就只会跟着网上的教程 copy 一点配置,但是不理解这些配置背后的原理。那么怎么来理解这句话呢,我们可以把握到三个要点:

  • 首先,Gradle 是一种 构建工具
  • 其次,Gradle 是 基于 maven 概念的;
  • 最后,Gradle 使用 Groovy 语言来声明。

Gradle 官网:https://gradle.org/

为什么使用Gradle?

Gradle 的核心是在基于 GroovyDomain Specific Language(DSL) 语言进行一个丰富的扩展。Gradle 具有以下优点:

  • 更容易重用资源和代码;
  • 可以更容易创建不同版本的程序;
  • 更容易配置、扩展;
  • 更好的 IDE 集成。

Gradle基础配置

首先明确 GradleMaven 一样,也有一个配置文件,Maven 里面是叫 pom.xml,而在 Gradle 中是叫 build.gradleAndroid Studio 中的 Android 项目通常至少包含两个 build.gradle 文件,一个是 Project 范围的,另一个是 Module 范围的,由于一个 Project 可以有多个 Module,所以每个 Module 下都会对应一个 build.gradle

Project 下的 build.gradle 是基于整个 Project 的配置,而 Module 下的 build.gradle 是每个模块自己的配置。

project#build.gradle

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

buildscript {
    repositories {    // 构建过程依赖的仓库
        google()
        jcenter()
    }
    dependencies {    // 构建过程需要依赖的库
        classpath 'com.android.tools.build:gradle:3.5.3'

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

allprojects {         // 整个项目依赖的仓库
    repositories {
        google()
        jcenter()
    }
}

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

注:大家可能很奇怪,为什么仓库 repositories 需要声明两次,这其实是由于它们作用不同,buildscript 中的仓库是 gradle 脚本自身需要的资源,而 allprojects 下的仓库是项目所有模块需要的资源。所以大家千万不要配错了。

module#build.gradle

// 声明插件,这是一个android程序,如果是android库,应该是com.android.library
apply plugin: 'com.android.application'

android {
    compileSdkVersion 29                 // 编译版本
    buildToolsVersion "29.0.2"           // buildtool版本
    defaultConfig {                      // 默认配置
        applicationId "com.gradle.test"  // 包名
        minSdkVersion 14
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {                         // 构建配置(混淆、签名等配置)         
        release {
            minifyEnabled true
            zipAlignEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            debuggable true
            minifyEnabled false
        }
    }
}

// 模块依赖
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])  // 依赖libs目录下所有jar包
    implementation 'androidx.appcompat:appcompat:1.0.2'       // 依赖appcompat库
}

Gradle相关配置

现在大家对 build.gradle 已经初步了解了,我们再看下其他一些与 gradle 相关的文件。

gradle.properties

在使用 Android Studio 新建 Android 项目之后,在项目根目录下会默认生成一个 gradle.properties 文件,我们可以在里面做一些 Gradle 文件的全局性的配置,也可以将比较私密的信息放在里面,防止泄露。

gradle.properties 里面定义的属性是全局的,可以在各个模块的 build.gradle 里面直接引用,因此可以在这里面可以定义一些常量供 build.gradle 使用。

还可以将一些构建环境的配置信息放在 gradle.properties 文件中,如果想了解更多如何配置编译环境,可以访问Build Environment

settings.gradle

settings.gradle 文件是用来配置多模块的,比如你的项目有两个模块app,library,那么你就需要在这个文件中进行配置,格式如下:

include ':app',':library'
rootProject.name='My Application'

gradle目录

gradle 目录下有个 wrapper 目录,里面有两个文件,gradle-wrapper.jargradle-wrapper.properties,它们就是 gradle wrapperGradle 项目都会有,你可以通过命令 gradle init 来创建它们(前提是本地安装了 gradle 并且配置到了环境变量中)。

gradle-wrapper.properties 配置本地路径,配置如下:

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip

各配置项作用如下:

  • distributionBase:下载的 Gradle压缩包解压后存储的主目录
  • distributionPath:相对于 distributionBase 的解压后的 Gradle 压缩包的路径
  • zipStoreBase:同 distributionBase,只不过是存放 zip 压缩包的
  • zipStorePath:同 distributionPath,只不过是存放 zip 压缩包的
  • distributionUrl:Gradle 发行版压缩包的下载地址

gradlew和gradlew.bat

gradlewgradlew.bat 分别是 linux 下的 shell 脚本和 windows 下的批处理文件,它们的作用是根据 gradle-wrapper.properties 文件中的 distributionUrl 下载对应的 gradle 版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的 gradle,即使该环境没有安装 gradle 也可以,因为 gradle wrapper 会自动下载对应的 gradle 版本。

gradlew 的用法跟 gradle 一模一样,比如执行构建 gradle build 命令,你可以用 gradlew buildgradlewgradle wrapper 的缩写。

gradle仓库

gradle 有三种仓库:maven仓库,ivy 仓库以及 flat 本地仓库。声明方式如下:

maven { url 'xxx' }
ivy { url 'xxx' }
flatDir { dirs 'xxx' }

有一些仓库提供了别名,可直接使用:

google()
jcenter()
mavenLocal()
mavenCentral()

gradle任务

gradle 中有一个核心概念叫任务,跟 maven 中的插件目标类似。

gradleandroid插件提供了四个顶级任务:

  • check:运行检测和测试任务
  • build:运行 assemble 和 check
  • clean:清理输出任务
  • assemble:构建项目输出

执行任务可以通过 gradle/gradlew + 任务名称的方式执,执行一个顶级任务会同时执行与其依赖的任务,比如执行下面的任务:

gradlew assemble

它通常会执行:

gradlew assembleDebug
gradlew assembleRelease

这时会在你项目的 build/outputs/apk 或者 build/outputs/aar 目录生成输出文件。

可以通过下面的命令列出所有可用的任务:

gradlew tasks

在 Android Studio 中可以打开右侧 gradle 视图查看所有任务。


评论
 上一篇
Kotlin 为 Map 提供的默认值相关的扩展 Kotlin 为 Map 提供的默认值相关的扩展
本文转载自:https://mp.weixin.qq.com/s/iovPlEV9ZwEEv2Xj2KLIPw Map 的 Value 类型是一个可空类型,Kotlin 早就想好了怎么帮你优雅地面对它。 Map 是我们经常用到的集合框架
2019-06-12
下一篇 
Android 后台服务 JobIntentService 使用详解 Android 后台服务 JobIntentService 使用详解
Android 8.0(API 26) 对系统资源的管控更加严格,添加了后台限制规则。 如果满足以下任意条件,应用将被视为处于前台: 具有可见 Activity(不管该 Activity 已启动还是已暂停); 具有前台服务; 另一个前台应
2019-06-06
  目录