什么是Gradle
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。——维基百科
以下简要介绍几个相关概念:
1. 建构工具做的工作包括:编译源代码、运行测试、拷贝Class文件到目标目录、签名、打包、依赖管理等。目的是让开发人员更加专注于代码的编写。
2. Groovy:是Java平台上设计的面向对象编程语言。这门动态语言拥有类似Python、Ruby和Smalltalk中的一些特性,可以作为Java平台的脚本语言使用。Groovy的语法与Java非常相似。
相对于Ant和Maven来说,Gradle可以算是新一代的自动化构建工具,而且Gradle在基于它们的基础上优化的同时还可以兼容这两者。
Gradle与Android Studio
Android Studio(以下采用缩写AS)采用的构建工具即Gradle,Gradle可以辅助我们简化很多复杂的操作流程如:依赖管理、多渠道打包、签名信息配置、批量修改生成的apk文件名等,因此学习Gradle显得更为重要。当然,以下的介绍的Gradle相关特性和使用都是以AS为例的。
Android Studio工程中与Gradle相关的目录
使用Android Studio新建一个工程之后,其目录结构是这样的(需要强调一下,以下的目录结构以及文件内容都只是新建项目时默认的样子,更高级的用法以及特点将会在后续的章节提及):
├── app········· #Android App目录
│ ├── app.iml···············AS识别项目的配置文件
│ ├── build··················#模块构建输出目录(代码编译后生成的文件存放的位置、生成的Apk文件等)
│ ├── build.gradle····#module构建脚本
│ ├── libs····················· 相关库文件目录
│ ├── proguard-rules.pro··proguard混淆配置
│ └── src·······················源代码,资源等
│
├── build··············#构建输出目录
│ ├── generated
│ └── intermediates
│
├── build.gradle·····#工程构建文件
│
├── gradle
│ └── wrapper
│
├── gradle.properties······#gradle相关的全局属性设置
├── gradlew ·························#linux下的gradle wrapper可执行文件
├── gradlew.bat ·················#windows下的gradle wrapper可执行文件
├── local.properties···········配置Androod SDK位置文件
└── settings.gradle··········#工程配置
接下来详细介绍几个与Gradle相关的文件以及目录:
- build.gradle #工程构建文件
顶级构建文件,可以为所有子项目/模块添加常用的配置选项。
//buildscript中的声明是gradle脚本自身需要使用的资源
//可以声明的资源包括依赖项、第三方插件、maven仓库地址等。
buildscript {
repositories {
jcenter() //使用jcenter库
//mavenCentral()
}
dependencies {
// 配置使用gradle所需要依赖的版本库
classpath 'com.android.tools.build:gradle:2.1.0'
//注意:不要在这里配置项目所需要的依赖
}
}
//项目自身所需要的一些配置
allprojects {
repositories {
jcenter()
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- app/build.gradle #module构建文件
模块(module)中的构建文件,对当前模块生效。开发过程中最需要注重的一个文件,应用的相关特性都在这里进行配置。
//表示该module是一个应用(application)模块,应用了com.android.application插件;
//(如果是一个android library,那么这里的是apply plugin:'com.android.library')
apply plugin: 'com.android.application'
//安卓项目相关的配置,后续章节将进行更为详细的介绍
android {
//编译项目所用的SDK版本(即编译时的API版本),com.android.support的版本需要与这个一致
//建议(总是)采用最新版本
compileSdkVersion 23
//构建工具版本
buildToolsVersion "23.0.3"
defaultConfig {
//安装时,依据该ID区分是否为同一个应用
applicationId "com.wiky.supporttest"
//最低支持的系统版本(必须>=所有依赖库所支持的最低版本)
minSdkVersion 9
//举例说明其作用:假设我们compileSdkVersion采用了23(6.0),但是项目暂时还未对6.0的特性(如运行时权限)做相应的处理,
//那么可以设置targetSdkVersion的版本低于23。这样,应用仍可以正常运行在6.0的机子上(当然也就不具有运行时权限的特性)。
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
// buildTypes是构建类型,常用的有release和debug两种,可以在这里面启用混淆,启用zipAlign以及配置签名信息等。后面再具体介绍
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
//该module所需的依赖库配置
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.3.0'
}
- 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
PS:关于compileSdkVersion 和 buildToolsVersion这两个版本,在我们导入一些开源的项目时,也是需要关注的。最好在导入项目之前,找到对应的build.gradle文件,然后将其版本号改为当前可正常使用的版本号(即你本地能够顺利运行的项目中对应的版本号)。这样可以很大程度上避免导入项目时的“卡死”(构建中…)现象。
- settings.gradle #工程配置
这个文件是全局的项目配置文件,里面主要声明一些需要加入 gradle 的 module,即告诉gradle项目中有哪些模块(module)需要处理,文件内容:
//如果有多个module的话,格式如:include ':app', ':otherModule',.....
include ':app'
- 1
- 2
gradle.properties #gradle相关的全局属性设置
在google开源的[iosched][1]项目中,可以看到他们利用了该文件配置了一些builde.gradle中需要用到的常(变)量, 如com.android.support. 的版本号以及签名信息相关的配置。利用该文件进行统一依赖管理可参见:[Gradle统一依赖管理][2]gradle.wrapper (Gradle Wrapper )
它允许你的机器在不需要安装运行的情况下就能运行Gradle脚本(我们在下载AS后可以直接开始使用gradle、开发项目,而无需另外下载及安装gradle,主要归功于这一特性),而且更重要的是它确保了build脚本运行在指定版本的Gradle。它会从中央仓库中自动下载Gradle,解压到你的文件系统,然后用来build。