你真的了解Gradle吗?
题外话:其实本来不想取这个名字的,但是感觉不取这个名字感觉没有几个人看啊。大家肯定觉得这个名字比较高大上吧!哈哈哈哈。好了,收。
前言
在平时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
上一篇: Swing GUI界面设计
下一篇: 基于jquery实现多级菜单效果