一、了解
gradle是个什么东西,一开始的时候我并没有一个很深的概念要去了解,完全当它是个工具来用,而Google就是用户手册。刚开始还好,到后面就不行了,遇到一些问题,莫名其妙,简直烦炸!至此,我开始了解gradle
就像常说的,gradle是个构建工具,它作为一个新起之秀,有ant,maven等前辈。那构建工具用来干什么的?
顾名思义:构建工具是用来将项目源代码进行build,然后得到output的一个工具。(所以用不好就会烦炸,明明源代码啥都有,就是得不到output,想想就害怕)。那么这些个构建工具有什么区别,从一片知乎上看到,ant是朴素的,任务清晰,当时不管理依赖。maven是厉害的,他管理依赖,但是不太灵活。最后就有了gradle,我的需求,他都可以满足:构建,打包,依赖管理,项目配置,等等。
重点来了,对于一个构建工具,我们要注意什么?在我开来,第一是构建脚本,第二是项目配置结构,第三是命令使用。清楚他的构建脚本,知道他会干什么,如何定义,然后就是项目结构,如何配置才能让项目能顺利构建,最后就是对各种命令的使用,充分发挥构建工具的作用了。
最后,我是个android开发者,常常用到gradle,也是官方默认的管理工具,就只能去用了。还有就是,他是基于jvm运行的,这是前提。
二、入手
入手的方式有两种:一种是手动创建一个gradle管理的项目,一种是拿到一个gradle管理的项目。
显然,自己创建的方式需要预先安装好gradle,无论是使用IDE的集成,还是使用命令行,一般都不会遇到什么问题,毕竟东西都是自己控制的。就不说啥了。
所以,重点就是拿到一个gradle的项目。gradle神奇的地方在于,即使你没有预先安装gradle,也可以使用它,因为他常常会带一个jar,来让那些没有gradle的环境去下载,然后使用。当然,这也是个坑,为什么,在后续的wrapper里明说,总的就是,我有个新版的gradle,你竟然去下载旧的,还巨慢!
使用Android Studio的同学相必早已在电脑有了gradle,当然,我们可以在gradle官网,去下载使用。官网还有许多docs,很有帮助。
至于说什么基于groovy的,作为一个程序员,代码简直简单到看不懂都好难,所以,直接上手吧,边摸索边学习即可。
三、见面
在Windows平台,一般一个由gradle管理的项目大概会有这么些个东西。
首先来看文件夹:.gradle(‘.’开头的都不好惹),build(执行过后常常将输出或者缓存放到这个文件夹),gradle(管理自己的地方),src(我们的源代码)
再看文件,大致可以分为3类:构建脚本(后缀为gradle),执行文件(gradlew和gradlew.bat),配置文件(后缀为properties)。显然,配置文件不是必须的,所以不同项目不同,而这里的local.properties就是Android SDK的目录设置配置。
所以,我们要关注的,就基本上是脚本而已。当然,文件夹gradle和配置文件是基础。也就是3个方面。
- 在脚本(*.gradle)里我们定义任务,管理依赖。
- 在文件夹gradle里我们管理不同版本的gradle,包括下载,升级等。
- 在配置文件里我们管理gradle运行时的属性,包括执行环境的一切(jvm设置,sdk路径等)
四、避坑
在使用前,当然要了解一些最基本的坑,不然可能艰难爬过了,后面又掉进去而不知道。
4.1、wrapper
在gradle文件夹里的就是这个,他是个管理gradle的东西,包括从无到有,版本选择,版本升级等。
重点:
gradle/wrapper/gradle-wrapper.properties
.
distributionUrl=https\://services.gradle.org/distributions/gradle-4.3.1-bin.zip
类似上面的就是要注意的地方,很多时候,我们本地没有它指定的版本,然后他就会去下载指定的版本,所以,我们把对应的版本号做好统一,避免去下载n多个版本,直接替换4.3.1为自己的版本号即可。
4.2、local.properties
本来这不是个坑,但是一不小心就会遇到,目前我只遇到,用它来设置本地Android SDK目录的时候,但是,有时候一些第三方的项目就没有这个文件,如果用Android Studio他会帮我们加上去,但是用命令行时就坑爹了。下面mark一下:
## This file must *NOT* be checked into Version Control Systems,
# as it contains information specific to your local configuration.
#
# Location of the SDK. This is only used by Gradle.
# For customization when using a Version Control System, please read the
# header note.
#Sat May 12 08:39:04 CST 2018
ndk.dir=D\:\\sdk\\ndk-bundle
sdk.dir=D\:\\sdk
显然,后面的路径要根据各位同学本地的sdk来设置。
五、开始
终于来到正式的地方了,正正经经的使用。我们可以选择使用IDE提供的工具栏或者使用命令行。两种方式都会说一下,当然,IDE使用的本质也是命令行了,所以,命令行才是本质。
说明:当使用wrapper时,命令换成gradlew,能更新或者下载wrapper配置里的gradle然后使用
概念:project和task,project有一个或多个task或字project构成,task是gradle的最小执行单元。而在“见面”里的setting.gradle里,就是来声明project包括了那些子project的。task在build.gradle里定义。
其实,本文目的并不单纯,下面的大多都是结合Android Studio和android plugin来讲述的,毕竟我是做Android的。
5.1、gradle in Android Studio
以上就是在android studio里提供的task的列表,我们只需要双击就能使用,下面简单介绍一下。
呃呃呃,好像没啥好说的,唯一提一下的就是:assemble的意思是集合,打包之类的,显然,这就是个将所有东西编译,打包成运行文件的操作,具体后面说,其他的猜一下也差不多了,或者google一下,毕竟我也没用多少。
补充一点,在android studio里的构建任务,可以参考官网里的构建。
5.2、gradle in CLI(command line interface)
命令解释:
//命令格式,taskname可以多个,用space隔开
> gradle [taskName...] [--option-name...]
//多项目情况,如果是rootProject,则最前面的":"可以省略
> gradle :mySubproject:taskName
//环境路径基于的文件路径,上例等于如下
> cd mySubproject
> gradle taskName
//exclude task,如:不执行test
> gradle dist --exclude-task test
//失败后,继续task
> gradle test --continue
常见命令:
//assembling all outputs and running all checks
> gradle build
//running applications
> gradle run
//running all checks
> gradle check
//cleaning outputs
> gradle clean
//get report(在gradle 加-q 可以只输出核心内容,安静模式)
> gradle projects
> gradle tasks [--all]
//get task usage help
> gradle help --task someTask
//list dependencies
> gradle dependencies //对应dependencies
> gradle buildEnvironment //对应buildscript
> gradle dependencyInsight --dependency name //查看特定依赖
//list properties
> gradle properties
//list models
> gradle model
加速构建:
--build-cache, --no-build-cache
reuse the outputs. Default is off.
--configure-on-demand, --no-configure-on-demand
Only relevant projects are configured in this build run. Default is off.
--parallel, --no-parallel
Build projects in parallel. Default is off.
//对于gradle的性能调优,可以加--profile生成执行时间报告
加速构建之gradle.properties设置:
org.gradle.parallel=(true,false)
org.gradle.configureondemand=(true,false)
org.gradle.caching=(true,false)
当然,在很多时候只需要配置好properties就可以定制很多特性了,全部请查看
gradle_configuration_properties。
六、Android Plugin DSL
第一次体会到什么叫DSL(domain-specific language) ,像android plugin,他定义了很多只针对android项目的一些东西,然后在脚本里会用到(区别于一般的编程语言),所以,这种domain-specific当然是有reference啦(我是今天才发现,真是坑)Android Plugin DSL Reference
在官网里我们看到有大概十几个configration block,这都是定义好的,可以用来控制android项目的某些东西的。下面就几个常用的做一下介绍。当然了,要使用就要在root project里的buildscript里声明使用这个dependency(IDE自动弄好了,此处说明一下)。
6.1、概览
在Android项目里的build.gradle里,主要看android{},dependencies{},这两大块,而android{}里的就是这里的重点,其余都算是普通gradle的内容。
6.2、android{}
全局配置
直接在里面配置
android {
compileSdkVersion 26
...
...
}
原来旧的版本还有个buildToolVersion的设置,后来更新了,直接有提供默认的设置了,就不同自行设置了,而一般我们就加这一个而已。
sourceSets{}
android {
...
...
sourceSets{
res.srcDirs = ['src']
jni.srcDirs = ['jniLibs']
}
...
...
}
一般遵循默认的设定,像java,res,assets,jniLibs都放在module/src/main/目录下,当然我们可以添加一些自己的文件夹到默认中,只需要在上面的[]里添加路径即可,用','分隔开。
defaultConfig{}
android {
...
...
defaultConfig {
applicationId "com.example.zyssky.interesting"
minSdkVersion 21
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
...
}
在这里一般设置一些通用的,就像上面这种类型的,设置。
buildType{}
android {
...
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
...
...
}
这里是设置构建类型的自定义的,包括debug,release,自定义,还有就是各类型里的签名,资源压缩,proguard问题,包名设置等等的,就是用来区分分割构建类型的设置的,完了后会自动生成task:assemble***来执行对应任务。构建类型之间还能够继承:
如:myBuildType.initWith(buildTypes.debug)
signingConfigs{}
android {
...
...
signingConfigs {
release {
storeFile file("path")
storePassword "123456"
keyAlias "rr"
keyPassword "1234567"
}
}
buildTypes {
release{
singingConfig signingConfigs.release
}
}
...
...
}
在配置完成后,再在buildTypes里设置就好。签名文件自己定义的是jks,不再是keystore了。
还有多渠道打包用到的productFlavour{},使用java特性时的compileOptions{},还有lint检查时的lintOptions{},具体使用根据具体场景,参考官网教程使用即可。
七、小结
这里我们没有做很多介绍一些用法,毕竟很多东西IDE都默认配好了,就是当出现问题或者需要自定义的时候,我们才会去着手,而这里也只是介绍了各自的职责,各个定义,以便有需要时该怎么办,可以怎么办,有个方向,而不是一昧地上网搜,却不知道该搜啥,也无法判断这是什么问题。东西很多,用法灵活,讲是不可能讲完的,所以了解一下,让自己能知道如何正确的走下去就是我的目标了。最后我们要与时俱进,一些关于gradle的更新(在Android Studio里的),记得查看官网更新report。
注释:
依赖管理:一个项目可能会用到第三发的库,之前我们或许会采用手动添加jar或之类等的方式来支持这个依赖,而如果构建工具能进行依赖管理,就可以开源仓库中获取源代码,然后集成到项目,开发者只需要一两行来声明某个依赖即可。当然也能进行本地的依赖管理了。
参考:
【2】Gradle 官网