1. Wrapper
看完直接说结论:
结论一:Wrapper
与Gralde
间是解耦的
Wrapper
可以理解为一个Gradle
的代理:代理Gradle
的安装和调用。
没有Wrapper
你照样可以在系统上安装Gradle
,但你需要自己去维护和管理Gradle
升级等操作。当然这不是重点,重点是你需要维护整套Gradle
的环境:比如配置环境变量等,装上并不代表就能用了。还有麻烦的地方,当你把Gradle
加入到自己的项目工程中时,你同样要劳神费力的配置一翻。
使用Wrapper
后,你可以安心的托管了。比如以后升级,你无需自己去下载,而是直接修改下配置文件,交给Wrapper
去打理就好了。Wrapper
会维护自己的一套机制,你之前在安装的所有版本的Gradle
,Wrapper
都会完全无视,即使你要的版本已经被你之前手动安装过了,一旦使用Wrapper
后,还是会下载那个版本到它指定的目录中。
之前说过,Wrapper
是Gralde
的代理,执行Gradle
的task
时:
对于每一个/gradle <task>
指令,都可以使用/gradlew <task>
指令去替代。
所以说了这么多,Wrapper
到底是什么?
Wrapper其实就是一定文件的集合。包含:一个核心JAR,1个配置文件和2个脚本文件。
配置文件(gradle/wrapper/gradle-wrapper.properties
):配置Gradle
的下载、解压的路径,下载的地址等信息。
JAR(gradle/wrapper/gradle-wrapper.jar
):Wrapper
自身的代码,Wrapper
能做什么,发挥什么样的作用完全来自这个JAR
。
脚本文件(gradlew.bat
和gradlew
,分别对应两种操作系统):用于执行Gradle
的task
(注意是调用Gradle
的,不是Wrapper
的)。操作方式:/gradlew <task>
。
如果:删除Windows
下某个项目中的gradlew.bat
文件,然后执行gradlew
指令时,会提示:gradlew
不是内部或外部命令,也不是可运行的程序或批处理文件。 恢复后就正常了。
什么是Gradle distributions
?
这个词在开头的三篇文章中经常出现,它表示的很简单:就是Gradle
自己的版本/们(注意,还是与Wrapper
无关)。
如果使用Wrapper
,Gralde distribution
就会被下载到gradle/wrapper/gradle-wrapper.properties
所配置的路径下,下载完毕后会自动解压。
wrapper.properties里的distributionUrl的值就是具体distribution
的下载地址。wrapper/dists
目录指的就是distribution
的目录。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
distribution
分bin
和 all
两种版本,all
等于bin
+src
all
包含:
bin
docs
init.d
lib
media
samples
src
bin
包含:
bin
init.d
lib
media
lib
下面是组成Gralde
的各种JAR
。
bin
下面就2个文件gradle
和gradle.bat
两个。是不是如Wrapper
的gradlew
和gradlew.bat
似曾相识?
没错,这两个就是分别在两种系统下执行Gradle task
的脚本文件~。
结论二:Gradle
/ Wrapper
与Android Studio
间是解耦的
经过上面的讲解,基本上可以推出这个结论了。
AS
在创建Android
工程时会自动创建Wrapper
,并且指定Android Plugin for Gradle
插件进行支持。
这样的话,我们连 将Wrapper
配置到项目工程中的 这个动作都可以省略了。很显然AS
这么做是为了给广大开发者节省时间。
当然,你也可以不这么做,正如官方文档所言:
Gradle
和Android Plugin for Gradle
插件独立于Android Studio
运行。这意味着,您可以在Android Studio
内、使用计算机上的命令行工具或在未安装Android Studio
的计算机(例如持续性集成服务器)上构建Android
应用。如果您不使用Android Studio
,可以学习如何从命令行构建和运行您的应用(资料3)。无论您是从命令行、在远程计算机上还是使用Android Studio
构建项目,构建的输出都相同。
最后,还有一个很小的或者无关紧要的点,在AS根目录下会有一个.gradle
的文件夹,当执行任何gradlew
,/gradlew <task>
指令时就会生成该文件夹(如果没有)。据说是Gradle
(不是Wrapper
)的编译系统,版本由Wrapper
指定。
.gradle
文件夹是否似曾相识? 没错,wrapper.properties
里的GRADLE_USER_HOME
也就是Gralde distributions
的path
路径,默认就是以.gradle
文件夹结尾的(见资料2)。
但这跟上面所说的工程根目录下的.gradle
文件夹没有一毛钱关系。
2. 什么是DSL
DSL(Domain Specified Language)领域专用语言:DSL说明。
3. Groovy
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy 可以使用其他 Java 语言编写的库。
Groovy 是用于Java虚拟机的一种敏捷的动态语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。使用该种语言不必编写过多的代码,同时又具有闭包和动态语言中的其他特性。
Groovy是JVM的一个替代语言(替代是指可以用 Groovy 在Java平台上进行 Java 编程),使用方式基本与使用 Java代码的方式相同,该语言特别适合与Spring的动态语言支持一起使用,设计时充分考虑了Java集成,这使 Groovy 与 Java 代码的互操作很容易。(注意:不是指Groovy替代Java,而是指Groovy和Java很好的结合编程。