简介
Gradle是一个自动化构建开源工具,使用一种基于Groovy的特定领域语言来声明项目设置,抛弃了基于XML的各种繁琐配置。Groovy语言是基于jvm的动态化语言,支持我们像写脚本一样写项目的构建规则。Gradle之所以能构建Android工程,是因为有基于Android的Gradle插件。
功能
- 支持多工程的构建
- 支持多方式的依赖管理,maven仓库、jcenter仓库,本地的jar
- 支持传递性依赖管理
- 支持个性化配置
与gradle相关的文件
在Android Studio中,我们新创建一个Android Project,会自动生成以下与gradle相关的文件或者文件夹
android project
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
├── build.gradle
├── settings.gradle
├── gradle.properties
└── app
└── build.gradle
复制代码
gradlew、gradlew.bat、gradle/wrapper/ 含义
Android Studio要构建Android程序需要用到Gradle,它们的作用就是下载Gradle。
gradlew是在linux、mac环境下,下载gradle的脚本文件
gradlew.bat是在windows环境下,下载gradle的脚本文件
gradlew-wrapper.jar 是gradle的封装体
gradlew.properties指定了下载gradle的版本以及下载之后存放的位置
复制代码
gradlew.properties 含义
打开该配置文件,它的内容如下:
#Thu Mar 28 11:25:12 CST 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-bin.zip
复制代码
下面来解释一下每个字段的含义
- distributionUrl
指定了下载gradle的地址,3.3是gradle的版本
gradle 有 3 种版本:
gradle-xx-all.zip 是完整版,包含了各种二进制文件,源代码文件,和离线的文档。
gradle-xx-bin.zip 是二进制版,只包含了二进制文件(可执行文件),没有文档和源代码。
gradle-xx-src.zip 是源码版,只包含了gradle的源代码,不能用来编译你的工程。
如果只是为了编译,可以不用完整版,只需要二进制版即可。
复制代码
gradle版本详见 2. zipStoreBase以及zipStorePath
指定了下载gradle.zip包存放的位置,其中zipStorePath是zipStoreBase的子目录 3. distributionBase以及distributionPath
指定了解压gradle.zip包存放的位置,其中distributionPath是distributionBase的子目录
distributionBase以及zipStoreBase的取值有两种
GRADLE_USER_HOME 和 PROJECT
其中,GRADLE_USER_HOME 表示用户目录。
在 windows 下是 %USERPROFILE%/.gradle,例如C:\Users.gradle\。
在 Linux下是 $HOME/.gradle,例如~/.gradle。
PROJECT 表示工程的当前目录,即 gradlew 所在的目录。
复制代码
根目录中的build.gradle含义
打开该配置文件,它的内容如下
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven {
url 'https://maven.google.com'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
复制代码
其中 buildscript代码块是gradle需要用到的 dependencies代码块表示 gradle构建工具依赖的那些插件 repositories代码块表示 gradle依赖的这些插件存放的位置
allprojects代码块表示构建android项目通用的一些配置
settings.gradle含义
打开该配置文件,它的内容如下
include ':app', ':library'
复制代码
settings.gradle是针对多模块的,用来定义哪个模块会被构建,app,library是我定义的两个模块。如果新创建了一个模块叫libraryA,如果libraryA想被构建的话,修改settings.gradle,如下:
include ':app', ':library',':libraryA'
复制代码
如果libraryA不想被构建,把它注释或者删除都可以。
app module 下的 build.gradle 含义
打开该配置文件,其内容如下
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion "28.0.3"
defaultConfig {
applicationId "com.jalen.gradledemo"
minSdkVersion 14
targetSdkVersion 28
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:28.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
复制代码
apply plugin: 'com.android.application' 的含义是使用一个application的插件,该插件包含了Android相关的所有工具
android代码块描述了app module在构建工程中所用到的参数
dependencied代码块描述了 app module所依赖的库文件
gradle.properties含义
配置gradle的全局管理文件 打开文件,如下:
#编译的SDK版本
COMPILE_SDK_VERSION=28
#编译工具版本
BUILD_TOOLS_VERSION=28.0.3
#android支持库的版本
SUPPORT_VERSION=28.0.3
复制代码
定义了全局的三个参数,在app的build.gradle中使用,代码修改如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion project.COMPILE_SDK_VERSION as int
buildToolsVersion project.BUILD_TOOLS_VERSION
defaultConfig {
applicationId "com.jalen.gradledemo"
minSdkVersion 14
targetSdkVersion 28
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:${SUPPORT_VERSION}"
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
复制代码