Gradle(一):概览与基本使用
前言
本文以Android Studio为例带你入门Gradle,其他Grandle项目(如SpringBoot)基本一致。
.
├── build.gradle
├── settings.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
约定:这是一个Androidstudio 3.4 默认创建的新项目,请将项目调整为Project模式
Gradle是什么?
答:与Ant,Maven类似,自动化建构工具
Gradle 和 Android 插件独立于 Android Studio 运行
看不懂没关系
请看[1]build.gradle
中的这一部分
dependencies {
...
testImplementation 'junit:junit:4.12'
...
}
项目构建完成后,点击展开ExternalLibraries
看,构建后已经有这个jar了,我们并没有去下载这个文件。很容易理解到这是Gradle自动帮我们下载的(其他的包也是),我们只需要用implementation或者testImplementation 加上我们想要的库,它会自动帮我们下载好,多方便。当然它的功能远不止这些,这里只是让你明白它是用来辅助我们构建项目的。
Gradle结构
与Gradle有关的文件已在第一张图标出,下面解释一下
[4]gradlew/gradlew.bat
一个shell脚本和一个Windows批处理脚本,用于使用Wrapper执行构建。
gradlew 官网介绍(英文)
感受一下?
打开终端
# mac osx/unix
./gradlew tasks
# windows
./gradlew.bat tasks
# 进入到项目所在根目录
cd ~/AndroidStudioProjects/gradledemo
./gradlew tasks
# 输出
> Task :tasks
------------------------------------------------------------
Tasks runnable from root project
-------------------------------------------------------
...
Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
Cleanup tasks
-------------
lintFix - Runs lint on all variants and applies any safe suggestions to the source code.
Help tasks
----------
buildEnvironment - Displays all buildscript dependencies declared in root project 'gradledemo'.
components - Displays the components produced by root project 'gradledemo'. [incubating]
dependencies - Displays all dependencies declared in root project 'gradledemo'.
dependencyInsight - Displays the insight into a specific dependency in root project 'gradledemo'.
dependentComponents - Displays the dependent components of components in root project 'gradledemo'. [incubating]
help - Displays a help message.
model - Displays the configuration model of root project 'gradledemo'. [incubating]
projects - Displays the sub-projects of root project 'gradledemo'.
properties - Displays the properties of root project 'gradledemo'.
tasks - Displays the tasks runnable from root project 'gradledemo' (some of the displayed tasks may belong to subprojects).
...
To see all tasks and more detail, run gradlew tasks --all
To see more detail about a task, run gradlew help --task <task>
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
这里省略了一些输出
打开AndroidStudio或者IEDA右侧边栏的gradle,比对命令行输出信息与GUI,两者是一致的。每个带设置图标图标的就是一个task,试着点击图中的help->tasks
,其控制台输出与./gradlew tasks
作用一样,也就是说图中的tasks都可以用命令执行。
task
task是什么
请看示例,在顶级build.gradle文件里加入
task hello1() {
doFirst{
println '111'
}
}
执行
./gradlew hello1
输出
> Task :hello1
111
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
打开AndroidStudio右侧的Gradle面板
task是命令执行的最小粒度,这里只是简单打印了一个字符串,上面那个task是清除build目录,其他诸如tasks,编译,构建都是一个个task
[5]setting.gradle
- setting.gradle
include ‘:app’
settings.gradle 文件位于项目根目录,用于指示 Gradle 在构建应用时应将哪些模块(Module
)包括在内。
从文件内容和项目目录不难发现:
- 此安卓项目根项目就是项目名,我们一般叫rootProject
实际上,setting.gradle文件里可以有rootProject.name这一项,但是省略了
- 此项目还包含了一个子项目(或者叫子模块,module)app
- app 模块里有自己的build.gradle文件
现在,你应该对这个安卓项目更熟悉了吧,很明显,gradle的核心就是build.gradle文件,下面开始介绍build.gradle文件。
根项目[3]build.gradle
顶级 build.gradle 文件位于项目根目录,用于定义适用于项目中所有模块的构建配置。 默认情况下,此顶级构建文件使用 buildscript 代码块来定义项目中所有模块共用的 Gradle 存储区和依赖项。
// 顶级构建文件,您可以在其中添加所有子项目/模块通用的配置选项。
/*
* 存储库块配置Gradle用于搜索或下载依赖项的存储库。
* Gradle预先配置对远程的支持
* 存储库,如JCenter,Maven Central和Ivy。
* 您也可以使用本地存储库或定义您自己的远程存储库。
* 下面的代码定义JCenter作为存储库Gradle应该用来查找它的依赖项。
*/
buildscript {
repositories {
// 从Android Studio3.0后新增了google()配置,可以引用google上的开源项目
google()
// 是一个类似于github的代码托管仓库,声明了jcenter()配置,可以轻松引用 jcenter上的开源项目
jcenter()
}
dependencies {
// dependencies块配置Gradle需要用于构建项目的依赖项。 以下行添加了Gradle的Android插件版本3.4.2作为类路径依赖项。
classpath 'com.android.tools.build:gradle:3.4.2'
// NOTE: 不要在此处放置应用程序依赖项; 它们应当放在单个模块build.gradle文件
}
}
// 所有模块/项目的共同配置,可在子模块中复写
/*
* allprojects块是您配置项目中所有模块使用的存储库和依赖项的位置,例如第三方插件库。
* 但是,您应该在每个模块级的build.gradle文件配置特定依赖
* 对于新项目,Android Studio默认情况下包括JCenter和Google的Maven存储库,但它不配置任何依赖项(除非您选择需要某些依赖项的模板)。
*/
allprojects {
// 配置所有项目的中央仓库,'junit:junit:4.12'就是从这两个中央仓库下载的
repositories {
google()
jcenter()
}
}
// 清除build目录
task clean(type: Delete) {
delete rootProject.buildDir
}
// 自定义task,打印111
task hello1() {
doFirst{
println '111'
}
}
简单示例:配置项目范围的属性
在hello1下面添加如下代码
ext {
testString = 'I am a testString'
}
在app模块下的build.gradle文件里添加task hello2
task hello2 {
doLast {
print rootProject.ext.testString
}
}
执行./gradlew app:hello2
> Task :app:hello2
I am a testString
BUILD SUCCESSFUL in 1s
1 actionable task: 1 executed
模块[1]build.gradle
模块级 build.gradle 文件位于各 project/module/ 目录中,用于配置适用于其所在模块的构建设置。 您可以通过配置这些构建设置来提供自定义打包选项(例如附加构建类型和产品风格),以及替换 main/ 应用清单或顶级 build.gradle 文件中的设置。
// 该模块引入的插件
// 还记得我们执行tasks出现的众多task吗,项目里并没有定义那些task,它们是通过插件引进来的
// 引入android插件,如果你开发springoot项目,那么引入的就是java插件
apply plugin: 'com.android.application'
// android块是您配置所有Android特定构建选项的地方。当然,如果不引入Android插件,就没他的事
android {
// 这不是篇专门讲述Android项目配置的文章,以下参数官网和网络均有说明
// https://developer.android.com/studio/build?hl=zh-cn
compileSdkVersion 29
buildToolsVersion "29.0.1"
defaultConfig {
applicationId "com.example.gradle_demo"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
// 模块级构建配置文件中的依赖项块指定仅构建模块本身所需的依赖项。
// 如何添加? https://developer.android.com/studio/build/dependencies?hl=zh-cn
dependencies {
// 添加本地libs目录下的jar包
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.2'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.2.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}
// 自定义task hello2 引用根项目中的属性
task hello2 {
doLast {
print rootProject.ext.testString
}
}
[4]gradle/wrapper/gradle-wrapper.properties
- gradle-wrapper.jar
包含用于下载Gradle分发的代码的Wrapper JAR文件。
- gradle-wrapper.properties
负责配置Wrapper运行时行为的属性文件,例如与此版本兼容的Gradle版本。
Gradle 属性文件
- gradle.properties
org.gradle.jvmargs=-Xmx1536m
android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true
可以在其中配置项目范围 Gradle 设置,例如 Gradle 后台进程的最大堆大小,编译检查插件等。
- local.properties
sdk.dir=/Users/apple/Library/Android/sdk
为构建系统配置本地环境属性,例如 SDK 安装路径。 由于该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,因此您不应手动修改该文件,或将其纳入您的版本控制系统。