Android Gradle之初识(一)

410 阅读2分钟

Gradle初识

Android打包的一种工具

生命周期

一个Android项目从 源代码+资源文件 -> 应用包,Gradle可大致分为3个步骤

  1. 初始化阶段:加载项目配置文件(build.gradle)并创建Gradle对象。解析项目结构、依赖关系等,并准备构建所需的资源和插件
  2. 配置阶段:根据初始化加载的配置文件来配置项目构建。执行各模块的Task、解析依赖关系、确定编译选项、处理资源文件、应用插件等。主要确定构建行为和内容(即告诉Gradle如何构建项目)
  3. 执行阶段:根据配置阶段确定的构建行为执行实际的构建任务。按指定顺序执行各任务(编译源码、处理资源文件、运行单元测试、打包等)。该阶段是构建的实际执行阶段,根据配置及任务间关系自动执行所需任务

任务Task

Gradle构建的操作单位,用于执行具体的构建任务,编译、打包等。一次编译由多个Task组成的

基础语法

// Gradle变量
val resDirs = arrayOf(
    "other"
)

// Gradle方法
fun getDate(): String {
    return ""
}

// Gradle任务
task("A") {
    println("this is A Task")
}

task("B") {
    // 依赖Task A
    dependsOn("A")
    println("this is B Task")
    doFirst {
        println("Task B doFirst")
    }
}

// 注册名为myCopy类型为Copy的任务,将src目录下所有文件拷贝至dst目录
tasks.register<Copy>("myCopy") {
    from("src")
    into("dst")
}

// 使用kotlin委托属性
val myCopy1 by tasks.registering(Copy::class)
val myCopy2 by tasks.registering(Copy::class) {
    from("src")
    into("dst")
}

项目Project

  • 一个Android项目在Gradle作用下会生成一个rootProject对象,每个module对应一个project
  • rootProject可以管理所有的子project,即可在根目录的build.gradle中一次性管理所有module中的依赖配置
# 方式一:根目录下独立配置各模块信息
// app module
project("app") {
    // 强制app工程使用某个版本的依赖以解决依赖冲突问题
    project.configurations.all {
        resolutionStrategy { 
            force("com.xxx:xxx:1.x.x")
        }
    }

    apply(plugin = "com.android.application")
        
    // 指定版本
    version = "1.0.0"
        
    // project可配置的均可在此配置
    dependencies {}
}

// lib module
project("lib") {
    apply(plugin = "com.android.library")

    dependencies {}
}

# 方式二:根目录下统一配置各模块信息,例强制依赖版本号
subprojects {
    // 对所有子module遍历
    project.configurations.all {
        // 对module中所有配置遍历
        resolutionStrategy.eachDependency {
            // 对配置中所有的依赖遍历
            if (requested.group == "org.greenrobot"
                && requested.name.contains("eventbus")) {
                // 通过依赖group和name,锁定一个依赖,并指定同一个版本号
                useVersion("1.x.x")
            }
        }
    }
}

小结

  • Task是Gradle工作的基本单元,编译时可在控制台中看到有很多task在执行
  • 每个项目都包含一个根build.gradle.kts和一个或多个模块build.gradle.kts组成
  • 每个build.gradle.kts中都是由多个Task组成的
  • 编译时每个build.gradle.kts都会被Gradle编译成Project字节码,build.gradle.kts中所有逻辑都会被映射成Project字节码的实现逻辑
  • 可在根build.gradle.kts中统一管理module配置信息