欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

你真的了解Gradle吗?

程序员文章站 2022-04-09 23:14:39
...
你真的了解Gradle吗?
gradle.png

题外话:其实本来不想取这个名字的,但是感觉不取这个名字感觉没有几个人看啊。大家肯定觉得这个名字比较高大上吧!哈哈哈哈。好了,收。

前言

在平时Android开发中我们常常使用Gradle来构建我们的项目,我相信大家都可能遇到以下问题:

  • 开启项目提示界面一直显示Gradle Build Running
  • Gradle传递性依赖冲突
  • 多渠道打包
  • .....等

相信大家在平时使用的时候,遇到问题都通过搜索引擎来解决,有些小伙伴可定会想,"作为一个Android开发者,我没有必要去详细的了解Gradle到底去这么使用,平时开发任务本来就比较重,哪里有时间有精力来学习呢" 但是个人觉得对Gradle的了解,对于我们平时开发项目有很重要的帮助。

官方介绍

要知道Gradle是什么,需要了解一些重要概念,先来官方介绍:

Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy的一门DSL,build脚本使用Groovy编写

看了官方介绍,我相信很多小伙伴和我一样。“md,看不懂!,说了那么多,我还是不知道。“ 那接下来我们就来看看Gradle到底是什么鬼。既然在官方介绍中。讲了Gradle是一种构建工具、那它到底是构建什么呢?解决什么问题呢?什么又是DSL呢?

构建工具到底解决了什么问题?

构建工具到底解决了什么问题,我们直接通过在Android下Gradle的使用来分析。请看下图:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.yzkj.yzapp"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    }
    buildTypes {
        release { 
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
   
}

dependencies { 
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:27.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:converter-gson:2.3.0'
    
}

上图是我们平时Android开发目录下Module对应的build.gradle文件,相应大家也发现了,我们在平时开发中,我们主要用到了一下功能。

依赖管理

在平时开发中,我们如果需要依赖第三方库,我们只需要在相应Module下的build.gradle文件,添加一句“compile 'xxxxx.xxxx.xxx'。Gradle就会自动帮我们去下载相应的第三方库。并形成依赖关系。

试想在没有自动化构建工具之前,我们的依赖管理,需要放在Lib目录中。这样Lib目录中就充斥着大量的三方jar包,很不利于管理,同时很容易出现jar包,版本冲突的问题。

测试

在没有自动化测试工具之前,我们的测试代码只是写简单的类包含Main方法进行简单的测试操作。

在使用了构建工具后,我们依赖相应测试框架,对我们的项目进行单元测试,功能测试等。

打包

通常我们将我们的程序打包,Android Studio 的build tools 进行打包(需要签名文件的位置,及签名的密码)。试想在平时开发中,肯定会有正式环境与测试环境,如果这个时候测试需要一个测试包。你就要去修改请求地址。并且重复打包这个流程。
这样操作难道不是很繁琐?

在使用了构建工具后。我们可以直接通过构建工具,直接进行测试版与正式版的打包。通过构建工具来直接进行不同渠道与不同版本的打包,难道不爽?

以上几点,都是在我们开发中。经常会遇到并且操作的事情。这个时候大家肯定都会想,这些重复低效的劳动为什么不通过程序来帮我们解决呢。所以理所应当的出现了一系列的项目构建工具。

各种构建工具的比较

Ant

Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。

Maven

Maven 在Ant的基础上、添加了依赖管理与发布,基于xml标记语言进行解析。

Gradle

Gradle 在Maven 的基础上。使用groovy语言来构建脚本。比Maven更快捷。且更灵活。

通过上述,构建工具是阶段性的发展,到了Gradle的时候。项目构建工具已经发展的很成熟了。这里如果大家对Gradle与Maven的区别感兴趣的话。可以参见官方介绍。传送门

DSL(Domain-specific language)是什么

之所以要把DSl放到这个地方来讲,个人觉得,当我们知道了项目构建工具到底要做什么的时候,在来了解DSL这个专业术语,大家要好理解一点。

DSL*

is a computer language specialized to a particular application domain. This is in contrast to a general-purpose language (GPL), which is broadly applicable across domains. There is a wide variety of DSLs, ranging from widely used languages for common domains, such as HTML for web pages, down to languages used by only one or a few pieces of software, such as Emacs Lisp for GNU Emacs and XEmacs. DSLs can be further subdivided by the kind of language, and include domain-specific markup languages, domain-specific modeling languages (more generally, specification languages), and domain-specific programming languages. Special-purpose computer languages have always existed in the computer age, but the term "domain-specific language" has become more popular due to the rise of domain-specific modeling. Simpler DSLs, particularly ones used by a single application, are sometimes informally called mini-languages.

翻译如下:是一家专门为特定的应用程序域中的计算机语言。这是一个通用的语言(GPL),这是广泛适用的跨域。有各种各样的DSL,从广泛的语言共同的领域,如Web页面的HTML,到只由一个或几个软件使用的语言,如Emacs Lisp GNU Emacs和XEmacs。DSL可以进一步细分的那种语言,包括特定领域的标记语言,特定领域的建模语言(更一般的,规范的语言),以及特定领域的编程语言。特殊用途的计算机语言一直在计算机时代的存在,但“领域特定语言”已经成为比较流行的针对特定领域建模的崛起。简单的DSL,特别是那些由单个应用程序使用,有时非正式地称为小语种。

简单理解来说DSl就是为了解决特定领域的一门语言。那相对于Gradle来说。Gradle是为了解决项目构建问题出现而出现的。其主要解决问题就是项目的自动化构建。

总结

Gradle是项目的构建工具,解决了我们平时开发中,项目测试、项目打包、项目依赖的问题。

后话

Gradle系列会继续写。如果大家喜欢我的写作风格的话。欢迎大家点赞。

最后,附上我写的一个基于Kotlin 仿开眼的项目SimpleEyes(ps: 其实在我之前,已经有很多小朋友开始仿这款应用了,但是我觉得要做就做好。所以我的项目和其他的人应该不同,不仅仅是简单的一个应用。但是,但是。但是。重要的话说三遍。还在开发阶段,不要打我),欢迎大家follow和start