码个蛋(codeegg)第 638 次推文
作者:厘米姑娘
原文: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:
task hello{//定义一个任务Task名为hello
doLast{//添加一个动作Action,表示在Task执行完毕后回调doLast闭包中的代码
println'Hello World'//输出字符串,单双号均可
}
}
//终端:
gradle hello//执行build.gradle中名为Hello的任务
//输出:
Hello World
5.Gradle Wrapper
a.含义:对Gradle一层包装,便于使用统一Gradle构建
b.目录结构:
|--gradle
| |--wrapper
| |--gradle-wrapper.jar
| |--gradle-wrapper.properties
|--gradlew
|--gradlew.bat
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 << {
def name = "张三”
println '单引号的变量计算:${name}'
println "双引号的变量计算:${name}"
}
运行./gradlew printStringVar输出结果:
单引号的变量计算:${name}
双引号的变量计算:张三
集合:以List和Map为例,介绍如何定义集合和访问集合元素
//List
task printList<def numList = [1,2,3,4,5,6];//定义一个List
println numList[1]//输出第二个元素
println numList[-1]//输出最后一个元素
println numList[1..3]//输出第二个到第四个元素
numList.each{
println it//输出每个元素
}
}
//Map
task printlnMap<def map1 =['width':1024,'height':768]//定义一个Map
println mapl['width']//输出width的值
println mapl.height//输出height的值
map1.each{
println "Key:${it.key},Value:${it.value}"//输出所有键值对
}
}
方法:方法调用传参的括号可省略;return不必需,无return时会将最后一行代码作为其返回值;允许将代码块(闭包)作为参数传递
//以集合的each方法为例,接受的参数就是一个闭包
numList.each({println it})
//省略传参的括号,并调整格式,有以下常见形式
numList.each{
println it
}
不是一定要定义成员变量才能作为类属性被访问,用get/set方法也能当作类属性
task helloJavaBean<Person p = new Person
p.name = "张三"
println "名字是: ${p.name}"//输出类属性name,为张三
println "年龄是: ${p.age}"//输出类属性age,为12
}
class Person{
private String name
public int getAge{//省略return
12
}
}
闭包:当闭包有一个参数时,默认为it,多个参数时需要一一罗列
//单个参数
task helloClosure<customEach{
println it
}
}
def customEach(closure){
for(int i in 1..10){
closure(i)
}
}
//多个参数
task helloClosure<eachMap{k,v->
println "${k} is ${v}"
}
}
def eachMap(closure){
def map1 = ["name":"张三