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

Gradle介绍

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

在Android中运用Gradle编译项目

在Android开发中,咱们通常运用gradle进行构建,需要重视的文件有以下几个。

  • build.gradle:Gradle的构建脚本,界说了项目的使命、依靠联系和其他构建相关的装备。这个称号的文件在咱们项目中有2个,一个是项目等级的,另一个则是模块等级(通常是app模块)的。项目等级的build.gradle类似于这样。
    Gradle构建脚本的入门教程
    而app模块的build.gradle类似于这样。
    Gradle构建脚本的入门教程
    由于我用的是kts文件,所以你有可能会有点不习惯。运用kts文件的原因主要是由于有代码提示。假如你想作为一个gradle脚本的深度玩家或者是项目的leader,必定要玩好gradle脚本,且主张转成kts。后边我会解说根本的kts转换模版。
  • settings.gradle:Gradle的装备文件,界说了项目的称号、子项目和其他装备。settings.gradle大概长这样。
    Gradle构建脚本的入门教程
  • gradle.properties:Gradle的特点文件,界说了一些全局的特点,如运用某些特性、构建环境等。properties便是咱们常用的特点文件,界说了一些键值对,这些特点可以直接被gradle读取。
    Gradle构建脚本的入门教程

gradle文件向kts文件改造

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")
}

项目等级的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)
}

settings.gradle。

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}
rootProject.name = "My Application"
include(":app")

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构建脚本的入门教程
点这个长得像大象的按钮就会触发前两个阶段。然后咱们履行指令如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")
    }
}

Gradle构建脚本的入门教程
注册一个名叫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!