Kotlin 35. Android Gradle 介绍

news2024/11/25 23:01:16

一起来学Kotlin:概念:22. Android Gradle 介绍

当我们刚开始进行安卓开发的时候,没有人关注 Gradle。我们主要专注于编写 Kotlin 代码和尽可能美观的 Android 应用程序。但随着时间的变化,我自己对 Gradle 感到越来越好奇。到底什么是 Gradle?我究竟应该怎么用?

在构建这些应用的时候,有时我们会偶然发现一个已经被互联网上其他人解决的问题,他们很友好地以库的形式分享他们的项目,我们可以在我们的应用程序中实现,并根据我们的需要定制它。为此,我们使用 build.gradle 文件来实现那些帮助我们构建应用程序的库,方法是指定它们的唯一包名称和版本。 这可能是我们在 Android 项目中使用 Gradle 最常见的用例。

但除此之外呢?我自己在写代码的时候,gradle的各个文件都是敬而远之的,不敢修改,也不愿修改,这就让我对 gradle 越来越好奇了。如果你和我一样,也想进一步对 gradle 有所了解,那么可以将这篇博客看完。


文章目录

  • 一起来学Kotlin:概念:22. Android Gradle 介绍
    • 1 什么是 Gradle
    • 2 build.gradle 以及 settings.gradle
      • 2.1 settings.gradle
      • 2.2 build.gradle (Project)
      • 2.3 build.gradle (Module)


1 什么是 Gradle

Gradle 是我们用于 Android 开发的构建(build)工具,用于自动化构建和发布应用程序的过程。 我们可能认为构建和运行应用程序非常简单,直接在 Android Studio 中按下运行按钮就可以了。 好吧,实际上,这个按钮背后会触发 Gradle 的内置任务(函数),这些任务负责在我们的模拟器或真实设备上运行应用程序。 这个过程需要几个步骤才能成功完成,以便我们看到正在运行的应用程序。以下是当我们按下运行按钮时发生的一般步骤:

  • Gradle 读取应用程序的构建配置文件 (build.gradle),其中包含有关依赖项、构建类型等的信息。
  • Gradle 下载并解析应用程序的依赖项。
  • Gradle 编译应用程序的代码,包括将 Java 或 Kotlin 代码转换为字节码。
  • 之后,Gradle 将编译后的代码和资源打包到一个 APK 文件中。

Gradle 带有许多内置功能,但它也允许我们编写自己的逻辑。 它提供自己的领域特定语言 (domain-specific language / DSL),这是一种为构建自动化领域量身定制的编程语言,它基于 Groovy 或 Kotlin 来描述构建脚本。

无论我们使用哪种编程语言,gradle 文件的结构都是相同的,它们都是从 DSL 的相同部分构建的。

2 build.gradle 以及 settings.gradle

Android 项目包含一个 settings.gradle 文件和两个 build.gradle 文件,其中一个放在根目录中,另一个包含在 app 模块中。 当我们在 Android 布局中打开我们的项目结构时,这可能容易把我们搞混,但它们的名称旁边会包含 ProjectModule 形式的小描述。

请添加图片描述

2.1 settings.gradle

我们看到,除了这两个之外,根目录中还有一个 settings.gradle 文件。让我们从它开始理解 gradle 文件的过程。

请添加图片描述

上图左侧显示了用 Groovy 编写的 settings.gradle 文件,在右侧显示了用 Kotlin 编写的相同文件。它里面有两个主要部分:

  • 插件管理
  • 依赖解析管理

这两个部分都是常规函数,但是因为它们只接收一个参数并且该参数是 lambda 函数的形式,所以我们可以忽略括号。

pluginManagement 函数包含一个 lambda 函数作为参数,它提供了一个 PluginManagementSpec 参数,可以通过 Groovy 中的“it”或 Kotlin 语言关键字中的“this”访问(但我们不需要明确指定它们)。 在 PluginManagementSpec 中,我们可以找到一个名为 repositories 的新函数,它包含新的 lambda 函数作为参数,并在内部提供了一个 RepositoryHandler 参数。 那是我们传递存储库(repositories)列表的地方。 这里提到的存储库,基本上代表 Gradle 将尝试查找插件(我们项目所需的插件)并下载它找到的插件的地方。 稍后,我们将看到我们需要指定必要插件的地方在哪里。

dependencyResolutionManagement 功能与 pluginManagement 功能类似,但它提供了存储库列表,Gradle 将在其中搜索项目所需的依赖项。

那么,插件(plugins)和依赖项(dependencies)有什么区别?依赖项是我们在开发应用程序时可以在 Kotlin 代码中使用的所有第三方库。另一方面,插件类似于依赖项; 最大的区别在于插件提供了 Gradle 在构建我们的项目时使用的所有任务(功能)。所以它基本上是我们 gradle 文件的第三方库。

Groovy vs Kotlin gradle functions

settings.gradle 文件的底部有一行指定项目中包含哪些模块,在 Groovy 中,该行代码看起来类似 include ':app'。这句话实际上指的是一个常规函数 include,接收一个类型为 String 的变量。Groovy 具有一项功能,使开发人员能够调用需要一个参数且不带括号的函数。 在 Groovy 中,我们可以使用单引号和双引号定义字符串。所以 Kotlin 中的等价行是 include(”:app”)

2.2 build.gradle (Project)

项目级 build.gradle 文件用于定义整个项目的全局配置和设置。 它还用于在顶层实现依赖项和插件。 默认情况下,build.gradle (Project) 中的所有配置和设置都应由项目中的所有模块继承,并且 build.gradle (Module) 文件能够覆盖它们。

在项目级 build.gradle 中设置的最常见的东西是构建 Android 应用程序所需的插件,例如:

  • Android Gradle
  • Kotlin
  • Hilt

有时我们还需要添加我们希望跨模块使用的库,例如:

  • Android Support Library
  • Google Play Services Library

这是我们在启动新的 Android 项目时拥有的项目级 build.gradle 的示例。

// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
    id 'com.android.application' version '7.2.1' apply false
    id 'com.android.library' version '7.2.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}

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

对我们来说重要的部分是 plugins 方法,它使我们能够定义我们的 Android 项目必不可少的核心插件。下面,我们来看一下定义这些插件的语法:首先,我们调用 id 函数并将一个参数作为 String 类型传递,该参数表示我们要使用的插件的唯一包名称。 这相当于 id(”com.android.application”)。下一步是设置上述插件的版本; 这也是一个接受一个字符串类型参数的函数。 这里的技巧是版本函数只能从 PluginDependencySpec 对象调用,并且我们收到的对象是 id("...") 函数的结果。 这同样适用于 apply 关键字; 它也是一个函数,就像 version 一样,但它接受一个布尔值作为参数。 如果我们想将其迁移到 Kotlin 以提高此代码的可读性,则该行将类似于 id(“com.android.application”).version(“7.2.1”).apply(false)

2.3 build.gradle (Module)

最后一个也是最常用的一个是我们应用程序模块中的 build.gradle。 它用于定义用于此特定模块的配置和设置。 在功能方面,它具有与项目级 build.gradle 类似的选项,但它带来了关注点分离。 因此,我们想要在我们的应用程序模块中放置的 Kotlin 代码中使用的所有库和框架,都应该在这个 gradle 文件的依赖项块中定义。 这些库工作所需的所有插件也应该在同一个 gradle 文件中定义。

如果我们查看 build.gradle (Module),我们可以找到三个主要部分:

  • Plugins
  • Android
  • Dependencies

我们已经熟悉了插件和依赖项部分(它们与我们已经介绍过的非常相似)。这里的新事物是 android 部分。这是我们可以对我们的应用程序进行大量配置更改的地方。 开发人员在这里设置的最常见的东西是:

  • minSdk、targetSdk、compileSdk的版本。
  • 应用程序的版本代码和名称。
  • 产品口味和构建类型。

以下是 build.gradle (Module) 的示例。

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.myapplication"
        minSdk 28
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled 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.5.1'
    implementation 'com.google.android.material:material:1.6.1'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

现在,我们已经涵盖了我们的 gradle 文件中提到的大部分基本内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365199.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

界面组件Kendo UI for Angular——让网格数据信息显示更全面

Kendo UI致力于新的开发,来满足不断变化的需求,通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。Kendo UI for Angular是专用于Angular开发的专业级Angular组件,telerik致力于提供纯粹的高性能Angular UI组件&#xff0c…

优秀的项目经理需要具备哪些品质呢?

要把项目的任务计划性地分配给各个负责人 1、要明确项目都有负责人,而且许多任务负责人有可能不止一个。用A代表负责人,B代表助手。每项任务都要有一个团队内部的负责人。 2、什么人承担什么责任都需由团队成员共同商讨来决定,这时候就需要…

大规模 IoT 边缘容器集群管理的几种架构-4-Kubeedge

前文回顾 大规模 IoT 边缘容器集群管理的几种架构-0-边缘容器及架构简介大规模 IoT 边缘容器集群管理的几种架构-1-RancherK3s大规模 IoT 边缘容器集群管理的几种架构-2-HashiCorp 解决方案 Nomad大规模 IoT 边缘容器集群管理的几种架构-3-Portainer 📚️Reference…

C进阶:6.C语言文件操作

目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 4.文件的顺序读写 fputc()写入文件 fgetc()从文件中读取 fgets()读取一段字符串 fprintf格式化写入文件、fscanf格式化读出文件 4.1对比一组函数 5.文件…

stm32f103封装 入门教学(一)LED程序CubeMX

本文代码使用 HAL 库。 文章目录前言一、LED 原理图二、CubeMX创建工程三、LED 相关函数1. 输出电平函数:2. 延时函数:3. 翻转电平函数:四、详细代码实验现象 :总结代码 源码:前言 从这篇文章开始,我们讲解…

Springboot 为了偷懒,我封装了一个自适配的数据单位转换工具类

前言 平时做一些统计数据,经常从数据库或者是从接口获取出来的数据,单位是跟业务需求不一致的。 比如, 我们拿出来的 分, 实际上要是元 又比如,我们拿到的数据需要 乘以100 返回给前端做 百分比展示 又比如&#xff…

如何通俗地理解原码、反码和补码

进制是什么?进制是人为设计的一套带进制计数方法,比如日常使用的十进制,就是0-9这10个数字,每逢十就会向高位进一。因为人类只有十根手指,所以天生地就会想到使用十进制--数到10发现手指头不够用了,就只能进…

JVM20浅堆深堆与内存泄露

浅堆深堆与内存泄露 1. 浅堆(Shallow Heap) 浅堆是指一个对象所消耗的内存。在 32 位系统中,一个对象引用会占据 4 个字节,一个 int 类型会占据 4 个字节,long 型变量会占据 8 个字节,每个对象头需要占用…

synchronized和ReentrantLock有什么区别呢?

第15讲 | synchronized和ReentrantLock有什么区别呢? 从今天开始,我们将进入 Java 并发学习阶段。软件并发已经成为现代软件开发的基础能力,而 Java 精心设计的高效并发机制,正是构建大规模应用的基础之一,所以考察并发…

(考研湖科大教书匠计算机网络)第六章应用层-第五节:文件传送协议FTP

获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:概述二:工作原理三:控制连接与数据连接本节对应视频如下 【计算机网络微课堂(有字幕无背景音乐版)】…

Linux NOR 开发指南

Linux NOR 开发指南 1 简介 编写目的 此文档描述Sunxi NOR 模块的使用方法,为相关人员调试提供指导 适用范围 boot0: 适用于brandy-2.0u-boot: 适用于u-boot-2018kernel: 适用于linux-4.9/linux-5.4 内核 BSP 的开发人员、测试人员 2 模块介绍 2.1 模块功能…

量化免费行情源最强对比分析--看这篇就够了

序言 很多想做量化的用户一直苦于没有稳定的行情源,我也是一个,但是其实市面上有很多免费好用的行情源,在这边给大家推荐几个我用过的,给大家做个参考 先做一下对比: INSIGHTTushare聚宽米筐支持语言java&#xff0c…

Python:try except 异常处理整理

目录 一、try except异常处理的语句格式 二、获取相关异常信息 (1)sys.exec_info() 三、traceback模块的常用方式 (1)traceback.print_tb(tb, limitNone, fileNone) 打印指定堆栈异常信息 (2)tracebac…

python自动化测试学习笔记-6redis应用

上次我们学到了redis的一些操作,下面来实际运用以下。 这里我们先来学习一下什么是cookie和session。 什么是Cookie 其实简单的说就是当用户通过http协议访问一个服务器的时候,这个服务器会将一些Name/Value键值对返回给客户端浏览器,并将…

ArcGIS土地利用变化出图

一、数据说明 1. lt51190382010144bjc00文件夹:2010年的影像数据存放在此文件夹中。 2. class2015.tif:2015年的土地利用结果数据。 3. 训练样本2010.shp:对2010年影像执行最大似然分类法所使用的训练样本数据。 4. 点位置.txt&#xff1…

剑指 Offer 47. 礼物的最大价值

剑指 Offer 47. 礼物的最大价值 难度:middle\color{orange}{middle}middle 题目描述 在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次…

深度剖析数据在内存中的存储(上)

目录 1. 数据类型介绍 1.1 类型的基本归类 2. 整形在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 一道小题 本章重点 1. 数据类型详细介绍 2. 整形在内存中的存储:原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 正文…

【手把手一起学习】(三) Altium Designer 20 原理图库添加元件

1 添加元件 元件符号是元件在原理图上的表现形式,主要由边框、管脚、名称等组成,原理图库中的元件管脚(顺序,间距等)与电子元件实物的引脚严格对应,绘制原理图库时,一定参考元件规格书和芯片数据手册中的说明&#xf…

狂飙吧,Lifecycle与协程、Flow的化学反应

前言 协程系列文章: 一个小故事讲明白进程、线程、Kotlin 协程到底啥关系?少年,你可知 Kotlin 协程最初的样子?讲真,Kotlin 协程的挂起/恢复没那么神秘(故事篇)讲真,Kotlin 协程的挂起/恢复没那么神秘(原理…

Elasticsearch:使用 pipelines 路由文档到想要的 Elasticsearch 索引中去

路由文件 当应用程序需要向 Elasticsearch 添加文档时,它们首先要知道目标索引是什么。在很多的应用案例中,特别是针对时序数据,我们想把每个月的数据写入到一个特定的索引中。一方面便于管理索引,另外一方面在将来搜索的时候可以…