本文正在参加「金石计划」
Gradle介绍
Gradle是一种基于JVM的构建工具,广泛应用于Java和Android项目中。相比于传统的构建工具,如Ant和Maven,Gradle具有更加灵活的构建脚本和更高效的构建过程,使得开发人员能够更加轻松地管理复杂的项目。
在Android中使用Gradle编译项目
在Android开发中,我们通常使用gradle进行构建,需要关注的文件有以下几个。
- build.gradle:Gradle的构建脚本,定义了项目的任务、依赖关系和其他构建相关的配置。这个名称的文件在我们项目中有2个,一个是项目级别的,另一个则是模块级别(通常是app模块)的。项目级别的build.gradle类似于这样。
而app模块的build.gradle类似于这样。
由于我用的是kts文件,所以你有可能会有点不习惯。使用kts文件的原因主要是由于有代码提示。如果你想作为一个gradle脚本的深度玩家或者是项目的leader,一定要玩好gradle脚本,且建议转成kts。后面我会讲解基本的kts转换模版。
- settings.gradle:Gradle的配置文件,定义了项目的名称、子项目和其他配置。settings.gradle大概长这样。
- gradle.properties:Gradle的属性文件,定义了一些全局的属性,如使用某些特性、构建环境等。properties就是我们常用的属性文件,定义了一些键值对,这些属性可以直接被gradle读取。
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 assembleDebug,就会执行有一定依赖关系的任务了。所以我们追加到打包流程中的task是在配置阶段已经安排好执行的顺序。
如何自定义task
转成了kts,我们写代码就方便了,有代码提示,完美,先自定义一个简单的task试试!
tasks.register("helloTask") {
dependsOn(":app:assembleDebug")
println("hello task")
doLast {
println("last hello task")
}
doFirst {
println("first hello 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!