Gradle构建脚本的入门教程

889 阅读4分钟

本文正在参加「金石计划」

Gradle介绍

Gradle是一种基于JVM的构建工具,广泛应用于Java和Android项目中。相比于传统的构建工具,如Ant和Maven,Gradle具有更加灵活的构建脚本和更高效的构建过程,使得开发人员能够更加轻松地管理复杂的项目。

在Android中使用Gradle编译项目

在Android开发中,我们通常使用gradle进行构建,需要关注的文件有以下几个。

  • build.gradle:Gradle的构建脚本,定义了项目的任务、依赖关系和其他构建相关的配置。这个名称的文件在我们项目中有2个,一个是项目级别的,另一个则是模块级别(通常是app模块)的。项目级别的build.gradle类似于这样。 项目级别的build.gradle 而app模块的build.gradle类似于这样。 app模块的build.gradle 由于我用的是kts文件,所以你有可能会有点不习惯。使用kts文件的原因主要是由于有代码提示。如果你想作为一个gradle脚本的深度玩家或者是项目的leader,一定要玩好gradle脚本,且建议转成kts。后面我会讲解基本的kts转换模版。
  • settings.gradle:Gradle的配置文件,定义了项目的名称、子项目和其他配置。settings.gradle大概长这样。 settings.gradle
  • gradle.properties:Gradle的属性文件,定义了一些全局的属性,如使用某些特性、构建环境等。properties就是我们常用的属性文件,定义了一些键值对,这些属性可以直接被gradle读取。 gradle.properties

gradle文件向kts文件改造

settings.gradle。

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
    resolutionStrategy {
        eachPlugin {
            if (requested.id.namespace == "com.android.tools.build") {
                useModule("com.android.tools.build:gradle:4.1.2")
            }
            if (requested.id.namespace == "org.jetbrains.kotlin") {
                val kotlin_version = "1.8.10"
                useModule("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
            }
            if (requested.id.namespace == "com.google.firebase") {
                useModule("com.google.firebase:firebase-crashlytics-gradle:2.9.2")
            }
        }
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            setUrl("https://jitpack.io")
        }
    }
}
rootProject.name = "My Application"
include(":app")

项目级别的build.gradle。

plugins {
    id("com.android.application") version("7.3.1") apply(false)
    id("com.android.library") version("7.3.1") apply(false)
    id("org.jetbrains.kotlin.android") version("1.7.20") apply(false)
}

app模块的build.gradle。

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}
android {
    namespace = "com.example.myapplication"
    compileSdk = 33
    defaultConfig {
        applicationId = "com.example.myapplication"
        minSdk = 21
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        getByName("release") {
            isMinifyEnabled = false
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    compileOptions {
        sourceCompatibility(JavaVersion.VERSION_1_8)
        targetCompatibility(JavaVersion.VERSION_1_8)
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    implementation("androidx.core:core-ktx:1.7.0")
    implementation("androidx.appcompat:appcompat:1.6.0")
    implementation("com.google.android.material:material:1.8.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
}

gradle常用的命令

由于gradle是一个脚本程序,我们通常也在命令行中使用到它。比如常用的命令包括:

  • gradle tasks:查看项目中所有可用的任务。
  • gradle clean:清空项目的构建输出目录。
  • gradle build:构建项目,生成可执行的Jar包或APK包。
  • gradle assemble:构建项目,生成项目的发布版本。
  • gradle run:运行项目的主程序。
  • gradle test:运行项目的测试程序。
  • gradle dependencies:查看项目的依赖关系。 我们用得最多的非assemble打包命令莫属了。如gradle assembleDebug、gradle assembleRelease、gradleXxxRelease。

gradle的生命周期

gradle的运行生命周期包括三个阶段,Initialization、Configuration、Execution。翻译成中文就是初始化阶段、配置阶段和执行阶段。初始化阶段检测settings.gradle文件,配置阶段整理每个项目和子项目的任务列表。 gradle sync 点这个长得像大象的按钮就会触发前两个阶段。然后我们执行命令如gradle assembleDebug,就会执行有一定依赖关系的任务了。所以我们追加到打包流程中的task是在配置阶段已经安排好执行的顺序。

如何自定义task

转成了kts,我们写代码就方便了,有代码提示,完美,先自定义一个简单的task试试!

tasks.register("helloTask") {
    dependsOn(":app:assembleDebug")
    println("hello task")
    doLast {
        println("last hello task")
    }
    doFirst {
        println("first hello task")
    }
}

自定义task输出 注册一个名叫helloTask的任务,这个任务依赖打debug包的任务,所以这个任务执行完,包也打完了。让一个任务依赖另一个任务使用dependsOn,在这个任务之前或之后还可以执行一些任务,我们使用doLast和doFirst。

将task打包成插件

使用gradle脚本,我们还可以在打包时做很多其他的事情。我们开发好的任务,如果想复用,那就要定义一个插件了。

class HelloPlugin : Plugin<Project> {
    override fun apply(project: Project) {
        project.task("hello task") {
            doLast {
                println("Hello JYM")
            }
        }
    }
}

apply<HelloPlugin>()

这样我们就理解了那些apply的插件怎么来的。

总结

说到底我们还是要把kotlin语言学透啊,俗话说得好,学好kotlin,走遍安卓项目都不怕!我们把gradle学好,不仅能够理解整个打包的流程,还能优化打包流程。所以,开始玩gradle吧!Go ahead!