点击上方“刘望舒”,选择“星标”
多点在看,就是真爱
作者: 厘米姑娘(腾讯开发妹子)| 来源 :公号 码个蛋
https://www.jianshu.com/p/1274c1f1b6a4
前言
在使用Android Studio过程中没少被Gradle坑过,虽然网上有很多简单粗暴的解决方案,但极少会说清楚缘由,所以一直想看一本叫《Android Gradle权威指南》。
不过由于书中实践内容很多,更像一本工具书,而且Gradle现已发行了好几版,因此本篇仅仅是陈列出一些大的要点,尤其是那些熟悉又陌生的名词,如果想要具体了解细节和操作流程,一定要跟着书探索哟~
-
Gradle入门
-
Groovy基础
-
Gradle构建脚本基础
-
Gradle插件
-
Java Gradle插件
-
Android Gradle插件
一. Gradle入门
1.本书环境
JDK:OpenJDK 1.8.0
Gradle:Gradle 2.14.1 All 版
IDE:Android Studio 2.2.3
Android Plugin:Android Gradle 2.2.3
Android:API 23
2.Eclipse和Android Studio
a.开发配置区别:
-
Eclipse+ADT+Ant
-
Android Studio+Gradle:Gradle比Ant更灵活,有效提高开发效率
b.Eclipse迁移到AndroidStudio两种方式:
-
使用AndroidStudio直接导入Eclipse工程
特点:使用AS默认推荐目录结构
-
使用Eclipse导出Android Gradle配置文件,并转换成Gradle工程,再使用Android Studio把它作为Gradle工程导入
特点:保留原项目结构
3.Gradle的ZIP解压后目录
-
docs:API、 DSL、指南等文档
-
init.d:gradle初始化脚本目录
-
lib:相关库
-
media:一些icon资源
-
samples:示例
-
src:源文件
-
getting-started.html:入门链接
-
LICENSE
-
NOTICE
4.引例:Gradle版Hello World
//build.gradle:
5.Gradle Wrapper
a.含义:对Gradle一层包装,便于使用统一Gradle构建
b.目录结构:
--gradle
-
gradle-wrapper.jar:具体业务逻辑实现的jar包
-
gradle-wrapper.properties:配置文件,包含篇配置信息如下图:
-
gradlew:Linux下可执行脚本
-
gradlew.bat:Windows下可执行脚本
c.常用命令:
-
生成:gradle wrapper,由Wrapper Task生成
-
配置参数:
–
gradle wrapper –gradle-version XXX用于指定使用的Gradle版本
–
gradle wrapper –distribution-url XXX用于指定下载Gradle发行版的url地址
-
自定义:task wrapper(type:Wrapper){ //配置信息 }
6.Gradle日志
a.日志级别:
b.日志输出代码:
-
使用print方法,属于quiet级别日志:println ‘XX’X
-
使用内置logger:
c.日志输出控制:
例如,输出QUIET级别及其之上的日志信息:gradle -q tasks
7.Gradle命令行
-
查看所有可执行tasks:./gradlew tasks
-
强制刷新依赖:./gradlew –refresh-dependencies assemble
-
多任务调用:./gradlew clean jar
-
查看帮助:./gradlew -?或./gradlew -h或./gradlew -help
二.Groovy基础
一句话表明Groovy的地位:Groovy于Gradle,好比Java于Android
1.特性:
Groovy是个灵活的动态脚本语言,语法和Java很相似,又兼容Java,且在此基础上增加了很多动态类型和灵活的特性,如支持闭包和DSL
2.语法
-
分号不必需
-
字符串:单引号和双引号均可定义一个字符串常量,区别在于单引号不能对字符串表达式做运算,而双引号可以
task printStringVar << {
-
集合:以List和Map为例,介绍如何定义集合和访问集合元素
//List
-
方法:方法调用传参的括号可省略;return不必需,无return时会将最后一行代码作为其返回值;允许将代码块(闭包)作为参数传递
//以集合的each方法为例,接受的参数就是一个闭包
-
不是一定要定义成员变量才能作为类属性被访问,用get/set方法也能当作类属性
new Person()
-
闭包:当闭包有一个参数时,默认为it,多个参数时需要一一罗列
//单个参数
三.Gradle构建脚本基础
1.Settings文件
-
作用:初始化、设置工程树
-
文件名:settings.gradle,放在Project下
-
常用方法:include方法指定能被Gradle识别的Module
//添加:app和:common这两个module参与构建
2.Build文件
-
Project的build.gradle:整个Project的共有属性,包括配置版本、插件、依赖库等信息
-
Module的build.gradle:各个module私有的配置文件
3.Gradle任务
a.
含义:指原子性操作
b.
关系:一个Gradle可包含多个Project,一个 Project可包含多个Task,即每个Project是由多个Task组成的;Task是Project的属性,属性名就是任务名
c.
创建
-
以任务名创建:接受一个name参数
def task myTask = task(myTask)
以任务名+Map创建:Map参数用于对创建的task进行配置,可用配置如下图
def task myTask = task(myTask,group:BasePlugin.BUILD_GROUP)
-
以任务名+闭包创建:常见形式
task myTask{
doLast{
println "第三种创建Task方法,原型为Task task(String name,Closure configureClosure)"
}
}
以上创建方式实际上最终都会调用TaskContainter#create()方法,使用./gradlew myTask命令执行任务
d.
访问
-
通过任务名访问:名称.方法
-
通过TaskContainter访问:tasks[‘名称’].方法
-
通过路径访问:参数可以为路径或名称
get方式
:tasks.getByPath(‘路径/名称’),若不存在会抛出UnknownTaskException异常
find方式
:tasks.findByPath(‘路径/名称’),若不存在返回null
-
通过名称访问:参数只能为名称
get方式
:tasks.getByName(‘名称’),若不存在会抛出UnknownTaskException异常
find方式
:tasks.findByName(‘名称’),若不存在返回null
可见任务名称是唯一的,这是因为TaskContainer的父类 NamedDomainObjectCopllection是个具有唯一不变名字的域对象的集合
e.
依赖:在创建任务时通过dependsOn指定其依赖的任务,可以控制任务的执行顺序
println
当执行task4时,会发现task1、task2会先执行,再执行task4
注:操作符<< 用在Task定义上相当于doLast
f.
排序:除了通过强依赖来控制任务的执行顺序,还可以通过 shouldRunAfter 和 mustRunAfter 实现
taskB
g.
分组& 描述:分组是对任务的分类,便于归类整理;描述是说明任务的作用;建议两个一起配置,便于快速了解任务的分类和用途
def task myTask = task(myTask)
h.
启用 & 禁用:enable属性可以启动和禁用任务,执行被禁用的任务输出提示该任务被跳过
def task myTask = task(myTask)
i.
执行分析:执行Task的时候实际上是执行其拥有的actions List,它是Task对象实例的成员变量;在创建任务时Gradle会解析其中被TaskAction注解的方法作为其Task执行的action,并添加到 actions List,其中doFirst和doList会被添加到action List第一位和最后一位
4.自定义属性
Project、Task和SourceSet都允许用户添加额外的自定义属性、并对自定义属性进行读取和设置
-
方式:通过ext属性,添加多个通过ext代码块
-
优点:相比局部变量有广泛的作用域,可以跨Project、跨Task访问,只要能访问这些属性所属的对象即可
//给Project添加自定义属性
四.Gradle插件
1.作用
-
可以添加任务到项目,比如测试、编译、打包等
-
可以添加依赖配置到项目,帮助配置项目构建过程中需要的依赖,比如第三方库等
-
可以向项目中现有的对象类型添加新的扩展属性和方法等,帮助配置和优化构建
-
可以对项目进行一些约定,比如约定源代码存放位置等
Gradle本身内置许多常用的插件,如若需要还可以扩展现有插件或者自定义插件,如Android Gradle插件就是基于内置的Java插件实现的
2.扩展现有插件
a.
插件种类
-
二进制插件:实现org.gradle.api.Plugin接口的插件,可以有plugin id
-
脚本插件:严格上只是一个脚本,可以来自本地或网路
b.
应用插件:通过Project#apply()方法,有三种用法
Map参数:void apply (Map options)如下:
二进制插件:
-
id:apply plugin:’java’
-
类型:apply plugin:org.gradle.api.plugins.JavaPlugin
-
简写:apply plugin:JavaPlugin
脚本插件:apply from:’version.gradle’
第三方发布插件:apply plugin:’com.android.application’
注意:应用第三方发布的作为jar的二进制插件时,必须先在buildscript{}配置其classpath才能使用,否则会提示找不到该插件
//buildscript:为项目进行前提准备和初始化相关配置依赖
<二>闭包:void apply (Closure closure)
apply {
<三>Action:void apply (Action super ObjectConfigurationActicn> action)
3.自定义插件
:实现Plugin接口、重写apply()方法
五.Java Gradle插件
1.项目结构
使用Java插件要先应用进来:
apply plugin:
此时会添加许多默认设置和约定,比如有以下默认项目结构:
|-example
|
2.源集(SourceSet)
-
作用:用于描述和管理源代码(java)及其资源(resources),如访问源代码目录、设置源集属性、更改Java原代码目录等
-
方式:通过sourceSets属性(是一个SourceSetsContainer)和sourceSets{}闭包
-
常用属性:
比如,在上述Java插件默认项目结构中的main和test就是内置的两个源集,现在更改main源集的Java源文件的存放目录到src/java下:
'java'
-
定义新源集:通过sourceSets{}闭包添加
'java'
此时会新建两个目录:src/vip/java和src/vip/resources
补充
:除了SourceSet,Java插件里常用的其他属性:
3.配置第三方依赖
a.
依赖方式
-
外部依赖:依赖外部仓库,如Maven、Ivy等
-
项目依赖:依赖项目,依赖后可以使用该项目的Java类
-
文件依赖:如依赖Jar包,出于安全考虑不发布到Maven而是放在项目的libs文件夹下
b.
具体方法
-
对于外部依赖,需要先在repositories{}闭包里声明依赖库的位置
-
在dependencies{}闭包添加依赖
– 外部依赖:说明依赖库的group:name:version
– 项目依赖:project(‘项目名称’)
– 文件依赖:files(‘文件名称’),多个文件逗号分开,或者fileTree(dir:’文件名称’,include:’*.扩展名称’)依赖指定文件夹下指定扩展名文件
-
几种依赖类型
举例:
'java'
4.内置任务
常用几种任务:
-
build任务:构建项目
-
clean任务:删除build目录及构建生成的文件
-
assemble任务:不执行单元测试,只编译和打包
-
check任务:只执行单元测试
-
javadoc任务:生成Java格式的doc api文档
还有些通用任务、对源集适用的任务:
5.多项目构建
-
含义:多个Gradle项目一起构建
-
方式:通过settings.gradle配置管理多项目;在每个项目都有一个build.gradle,采用项目依赖就能实现多项目协作
//settings.gradle
6.发布构件
-
构件:Gradle构建的产物,如Jar包、Zip包等
-
意义:发布构建给其他工程使用,可以发布到本地目录、Maven、Ivy等
-
方式:明确构件类型,并通过artifacts{}闭包配置需要发布的构建,在uploadArchives{}上传发布构件
//以发布jar构件为例
篇幅有限,更多请阅读作者妹子的博文:
https://www.jianshu.com/p/1274c1f1b6a4
——— END ———-
推荐阅读
Android系统服务(一)解析ActivityManagerService(AMS)
Android PMS的创建过程
美团跨平台框架Picasso,开启大前端的未来
彻底理解cookie、session、token
你好,我是刘望舒,十年经验的资深架构师,著有两本业界知名的技术畅销书。
如果你喜欢我的文章,就给公众号加个星标吧,方便阅读。
推荐一个可以让你
技术快速提升
的神奇地方,有兴趣的同学可以点击底部的
阅读原文
在看也是一种认可