用Gradle构建项目

在学习Gradle之前,我们有必要学习下Groovy是什么,并且如何运用。因为Gradle的前提是基于Groovy。正所谓磨刀不误砍柴工,预先善其事必先利其器。废话不多讲,我们下面介绍下Groovy是何许人也。

Groovy是什么?

对于Groovy的一个详细使用介绍,我已在另一个地址详细说明:传送门。下面只是简单的介绍。

Groovy是JVM的一个替代语言,这里的替代不是指完全的替代,而是可以在Java平台上可以进行Java编程,并且使用方法,能和现有的Java代码进行整合。

那么Groovy的特点有哪些呢?

  • Groovy指定的内容,都是public,除非自己另行指定。
  • Groovy在Java对象上增加了一些快捷方式及方法,更利于使用
  • Groovy省略了变量的类型声明。比如String str=””; 在Groovy里,就可以不用写
  • Groovy与Java对比,是动态的,Java在定义对象类型是固定的,属于固定型语言。String str=”xxx”
  • Groovy不必像Java那样先编译再运行,因为它属于脚本语言。脚本语言的特点就是在运行时进行解析。

还有个非常流弊的概念,在Groovy里,一切皆对象!(你也是对象,我也是。。。)

了解完我们的非常流弊的Groovy以后,我们这回就可以继续学习Gradle了。

Gradle是什么?

Gradle简介

是以一个简介的语法,来构建一个项目。正所谓Gradle单词的含义:“摇篮”。代替之前使用的Ant来构建项目,并且能支持很多依赖关系的编译、测试等工作。

为什么使用Gradle呢?

  • 基于Groovy,DSL(领域专用语言Domain Specific Language)可以混合各种的声明元素,用代码操控这些DSL元素,达到编程的目的
  • 使用灵活
  • 允许IDE集成* 脚本编译,能将启动时间缩减20%

那么什么是DSL呢?

DSL 定义为 “侧重特定领域的表达有限的计算机编程语言”。

DSL语法,称为领域专用语言。它的作用目的不是为了像Java或者其他编程语言那样,为了解决软件开发时所遇到的问题,而是为了解决某一个特定的问题,所设计的一种计算机语言。

DSL的特点像标记语言,它的特点可以被很多非程序员所轻松使用。

SQL 就是一种优秀的 DSL。

应用场景:
Ant:自己写的小项目,不大,因为ant灵活,运行又快
Maven:如果项目需要分享,或者达到团队内部的标准,可以使用Maven

Gradle结构

一般情况下,Gradle文件不需要我们去手动写,而是自动生成。但不排除你在某个时候需要修改里面的配置。so我们得了解他的基本配置是如何。

项目级的build.gradle结构(Project: XXX)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
buildscript {
//项目及的文件建立,使用buildscript定义的依赖关系//
repositories {

jcenter()
}
//依赖与jCenter库//
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0'
//项目依赖gradle1.0版本的Android插件//
}
}
allprojects {
//定义应用程序所需的依赖关系.//
repositories {
jcenter()
}
}
//应用取决于jcenter这个库//

模块级的build.gradle结构(Module: app)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
apply plugin: 'com.android.application'
//标注是一个android项目,该build.gradle文件是利用Android插件//
android {
//所有Android项目的具体参数//
compileSdkVersion 21
//项目目标版本是这个版本.//
buildToolsVersion "21.1.1"
////你要生成工具的版本.//
defaultConfig {
applicationId "com.example.jessica.myapplication"
//Defines your application’s ID. Note, earlier versions of the Android plugin used ‘packageName’ instead of ‘applicationID.’//
minSdkVersion 16
//The minimum API required by your project.//
targetSdkVersion 21
//The version of Android you’re developing your application for.//
versionCode 1
versionName "1.0"
}
buildTypes {
release {
//‘BuildTypes’ controls how your app is built and packaged. If you want to create your own build variants, you’ll need to add them to this section.//
minifyEnabled true
//Gradle runs ProGuard during the build process.//
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//Applies the default ProGuard settings from the Android SDK.//
}
}
}

dependencies {
//Declares the dependencies for the current module.//
compile fileTree(dir: 'libs', include: ['*.jar'])
//Although you can add JAR files by compiling them individually, this can be time-consuming if you have lots of JARs. In this example, we’re telling Gradle to add all the JAR files in the app/libs folder.//
compile 'com.android.support:appcompat-v7:21.0.3'
//To create more dependencies, add them to the depencies closure.//
}

grade-wrapper.properties(Gradle Version)

当你在运行初,会检查你的gradle有木有配置好。这里列举出你的gradle的home,及如果没有home的配置,如何去下载的URL。

1
2
3
4
5
6
7
8
distributionBase=GRADLE_USER_HOME
//Determines whether the unpacked wrapper distribution should be stored in the project, or in the Gradle user home directory.//
distributionPath=wrapper/dists
//The path where the Gradle distributions required by the wrapper are unzipped.//
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
//The URL where the correct version of Gradle should be downloaded from.//

settings.gradle(Project Settings)

这个文件展示的是你项目的不同模块。如果有多个模块,在这里添加即可。

1
include ':app'

gradle.properties(Project Properties)

这里包括整个项目的配置信息,你可以把你需要配置的属性添加到这个文件里。

local.properties(SDK Location)

这里配置的是Android SDK的路径,告知Gradle。

1
sdk.dir=/Users/XXX/XXX/XXX/...

以下是改造的build.gradle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.jikexueyuan.testandroid"
minSdkVersion 14
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
signingConfigs {
debug {
storeFile file("debug.keystore")
}
release {
storeFile file("release.keystore")
}
}
productFlavors {
dev {
manifestPlaceholders = [channel: "dev"]
minSdkVersion 14
applicationId 'com.jikexueyuan.testandroid'
targetSdkVersion 23
versionCode 1
versionName '1.0'
}
official {
manifestPlaceholders = [channel: "official"]
}
jifeng {
manifestPlaceholders = [channel: "jifeng"]
}
wandoujia {
manifestPlaceholders = [channel: "wandoujia"]
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.2.1'
}