最近发现有好多朋友问和Gradle相关的东西,于是决定写一系列博客,简单备用。
随着项目的逐步扩大与Android市场上应用需求的多样化,越来越多的应用需要集成众多的三方库与其它依赖,在Google推出的最新idea Android Studio中,引入Gradle用于项目构建工具,那么构建工具有什么优势呢?
构建工具的主要优势有以下几点:
便捷性(Portability)自动化(Automation)可重复性(Repeatability)那么构建工具有很多(PS:ANT),为什么要选择Gradle呢?
主要原因还是Google粑粑在Android Studio中选用Gradle作为idea的构建系统,事实上,Android Studio将整个应用的构建过程指派给了Gradle,当点击”运行”按钮时,Android studio会在运行过程中设置Gradle并在后台监控,通过学习Gradle相关知识,我们可以扩展该默认行为以构建能力更强且经过适当测试的Android应用。Gradle使得开发人员只需通过点击按钮就可以自动构建和测试应用,针对依赖和变种的管理也更加方便。另外Gradle是一种用于编写构建脚本的紧凑且强大的构建语言。
说了这么多,怎么安装Gradle呢?
在Android Studio中,项目构建过程中会执行gradlew脚本,在没有Gradle的情况下,从网络端下载。在命令台上我们可以使用如下方式安装独立的Gradle。
最新版的Gradle要求JDK或者JRE版本在1.7以上,所以先运行java -version查看JDK版本,过低先更新,随后使用包管理工具进行安装,在类Unix系统上使用SDKMAN,命令是sdk install gradle 3.3,在MAC上使用HomeBrew,命令是brew install gradle,在Windows上使用Chocolatey,命令是choco install gradle。随后并不需要其他的手动安装。
Gradle任务简介
对于Gradle而言,它的一个优势就是可扩展域模型,这个模型的核心就是任务(PS:task),任务是一种Grale可以推断出的自约束工作单元,任务的关键是任务所进行的操作,比如我们会新建一个任务用于编译某些java源文件,或者把一个文件从A目录复制到B目录又或者只是打印Hello,任务可以单独执行操作也可以声明对其他任务的依赖,Gradle会确保所有的这些依赖都在运行并确保它们所有的依赖性等等,任务还可以定义输入和输出,它所读取及所写入的文件,这使得Gradle能确定任务是否需要执行自己的工作或者所有的内容是否是最新状态,在这种情况下,它不需要运行。
创建简单任务
使用gradle -V命令查看Gradle版本,截图如下:
随后我们编写一个build.gradle文件,内容如下:
task hello { doLast { PRintln 'Hello world!' } }在当前目录执行gradle -q hello,我们可以看到如下运行结果:
通过上述运行结果我们可以看出,在这里这个脚本只是简单定义了一个名为hello的task,当执行gradle hello时,Gradle先执行名为hello的task,随后执行task中的动作,在这个task中所进行的动作就是输出Hello world!-q的意思是简洁输出,不输出日志,执行gradle hello的运行效果如下图:
Gradle需要执行大量工作才能启动,这主要是因为它需要调起java虚拟机实例,使用Gradle Demon可以缩短这一启动时间,Gradle Demon是一种挂靠在操作系统后台的进程,当Gradle使用Gradle Demon时,一个Gradle Demon已经启动完成并长期运行于后台,保证JBM实例处于活动状态,随后的Gradle都可以使用相同的实例运行,默认情况下,,当在命令行执行Gradle时,Android Studio会使用这种模式,但是必须明确指定启用这种模式。
Gradle的前世
apply plugin: 'com.android.application'android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.example.zbtuo.opengltriangles" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } }}dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.1.0' testCompile 'junit:junit:4.12'}上面是一个build.gradle的完整文件,从上述代码可以看出这是一种类似于分拆式JSON的语法.在最后可以看到一个名为hello的任务,用于输出”Hello world!”,Gradle文件是按照Gradle提供的特殊用途的构建语言编写的,它基于一个叫Groovy的通用脚本编制语言,Groovy对一些功能进行了语法改进使我们可以编写语言比使用java等代码看起来更自然的构建脚本。其次Groovy与Java完美集成,这是Gradle平台使用的编写语言,在使用Gradle时需要了解的主要内容是Android和task等关键字所来源于的Gradle构建语言,但是这对了解此构建语言如何以Groovy和Java为基础很有帮助。整个构建脚本具有所谓的委托对象,它会向构建脚本内的Groovy脚本编制语言公开Gradle构建语言。如果编写了一个Gradle插件,则可以用任何语言编写它并使用相同的委托对象。Gradle构建语言也称为Gradle DSL或域特定语言。域特定语言是针对特定任务精心定制的语言,在这个案例中,我们所谈到的域是Android构建,请注意描述构建和提供有关,如何让构建实现的说明之间存在巨大的差异。Gradle DSL声明为使你仅负责描述构建而且Gradle本身知道如何使其实现,这意味着你的构建脚本可能会短得多而且容易理解得多,但是在构建脚本内有一个可由你处理的完全成熟且强大的编程语言。我们衷心建议你保持构建脚本的声明性并且尽量不要用低级逻辑污染它,这正是Gradle插件的用途,你可以采用Groovy,Java或Scala等任何JVM语言来编写它们。
新闻热点
疑难解答