前言

本专栏内容主要分为两大部分:

  1. Groovy基础到进阶
  2. Gradle开发及Gradle在Android中的使用。

本专栏内容尽量做到覆盖全满,不遗漏知识点。

  1. 对于Groovy的学习会基于已掌握的Java及Kotlin语言,通过对比分析来提高学习效率。
  2. 对于Gradle的内容我们主要针对在Andorid开发中的实际使用来进行讲解,做到学以致用的目的。

1. Gradle介绍

  • Gradle是一款基于Apache的Ant和Maven概念的项目自动化开源构建工具。Gradle的核心是基于Java来实现的,可以把Gradle看成就是一个轻量级的Java应用程序。
  • Gradle是使用Groovy、Kotlin等语言编写自定义脚本,取代了Ant和Maven使用xml配置文件的方式,很大程度简化了开发时对项目构建要做的配置,使用更加灵活和强大。

1.1 为什么要学习Gradle

Gradle不仅是目前Andorid最主流的构建工具。而且不少技术领域如组件化、插件化、热修复,及构建系统 (很多优秀的框架都是在编译时或者打包之前做一些特殊的处理) ,都需要通过Gradle来实现,不懂Gradle将无法完成上述事情,所以学习Gradle非常必要。

1.2 关于项目构建

  1. 对于Java应用程序,编写好的Java代码需要编译成.class文件才能够执行。所以任何的Java应用开发,最终都需要经过这一步;
  2. 编译好了这些class文件,还需要对其进行打包。打包不仅针对于这些class文件,还有所有的资源文件等。比如web工程打包成jar包或者war包就包含了自己的资源文件,然后放到服务器上运行。
  3. Andorid工程编译好的class文件还要被打包到dex包中,并且所有的资源文件进行合并处理,甚至还需要对最终打包出来的文件进行加密和签名处理等等。

图解说明

1.3 自动化构建工具的发展

  1. “石器时代”:自己编写命令脚本,进行编译和打包
  2. “蒸汽时代”:Make、Ant工具的出现
  3. “电气时代”:Maven
  4. “信息时代”:Gradle,更高级的自动构建工具出现 …

1.4 Gradle提供了什么

  • 对多工程的构建支持非常出色,尤其是工程依赖问题,并支持局部构建;
  • 多种方式的依赖管理:如远程Maven仓库,nexus私服,ivy仓库或者本地文件系统等;
  • 支持传递性依赖管理;
  • 轻松迁移项目工程;
  • 基于Groovy等语言构建脚本,简便且灵活;
  • 免费开源,并且整体设计是以作为一种语言为导向的,而非成为一个严格死板的框架。

上面我们提到, Gradle是使用Groovy、Kotlin等语言编写自定义脚本,现在我们了解了Gradle相关的,接下来将介绍 Groovy。

2. Groovy介绍

Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy代码能够与Java代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其它非Java语言编写的库。

这里我们提到,Groovy代码能够与Java代码很好地结合,然后现在Android开发也慢慢往 Kotlin 发展,那么我们看看这三者的区别。

2.1 Groovy & Java & Kotlin

  • Groovy、Java及Kotlin都是基于JVM的开发语言;
  • Groovy基于Java,在语法上基本相似,但也做了很多自己的扩展。Groovy除了可以面向对象编程,还可以用作纯粹的脚本语言,这一点和Kotlin是一样的;
  • Goovy 和 Kotlin都有自己支持的DSL,两者有许多共通之处。

这里有一组比较有意思的对话:

Groovy:我不是针对Java,而是所有不能愉快写DSL的都是laji。
Clojure:我真的不是针对Java,只是关于并发,我有一个大胆的想法。
Scala:我也真的不是针对Java,只是关于并发,我还有一种大胆的想法。
Kotlin:我就是处处针对Java!
Java退出了群聊...

满满感受到Java的无奈 :》

2.2 Groovy特性

  • 同时支持静态类型和动态类型;
  • 支持运算符重载;
  • 支持DSL语法特性;
  • 本地语法列表和关联数组;
  • 各种标记语言,如XML和HTML原生支持;
  • 对正则表达式的本地支持;
  • Groovy和Java语法非常相似,可以无缝衔接使用Java;
  • 支持使用现有的Java库,并做了一定的扩展。

这里说到,Groovy和Java语法非常相似,可以无缝衔接使用Java,那我们来看看是如何无缝衔接的。

3. 从Java到Groovy

注:开发环境为:Idea+Groovy环境,所以开发者需要额外在Idea编译器里面配置Groovy环境。

如图所示

创建项目时选择Groovy选项,可以不用勾选Kotlin环境直接创建,毕竟要看如何从Java到Groovy。这里分别举几个比较常用的例子。

3.1 对应第一个项目

class HelloGroovy {static void main(String[] args) {System.out.println("hello Groovy!");}
}

这是很标准的第一项java项目。接下来我们看看 Groovy 的第一个项目

def test() {"hello Groovy!" //方法返回值不用写return,已最后一句话代码作为方法的返回类型
}println(test()) //代码末尾可以省略 分号println test() //打印甚至还能省略外面的一对大括号。

接下来看看我们经常用的循环:

3.2 对应的循环

class HelloGroovy {static void main(String[] args) {for (int i = 0; i < 3; i++) {System.out.print(i+"\t ha")}
//        System.out.println("hello Groovy!")}
}

这里不用多说了,java大家都熟悉。现在看看Groovy的语法。

3.times {println it+"\t haha"
}

或者

(0..2).forEach{println it+"\t haha"
}

运行效果

0     haha
1    haha
2    haha

熟悉Kotlin的小伙伴应该能够秒懂这段代码,毕竟 kotlin 是在 groovy基础上进阶改良的,所以作为 Kotlin的前辈,语法几乎都是类似的。

3.3 对应的安全操作符

我们就以最经典的非空判断为准。

class HelloGroovy {static String toUpperCase(String content) {if (content == null || content.length() == 0) {return "null";}content = content.toUpperCase();return content;}static void main(String[] args) {String content = "abc";System.out.println(toUpperCase(content));}}

这里很经典的非空判断,不为空就转大写。接下来看看Groovy对应的

def toUpperCase(str) {str?.toUpperCase()
}println toUpperCase("abc")
println toUpperCase(null)

Groovy运行效果

ABC
null

学过Kotlin的小伙伴都知道,Kotlin代码自带非空检测,只要可能为空的部分就必须让开发者处理,否则连编译都不能通过。要想通过编译,要么处理为永不为空,要么调用前加一个问号,表示为空就不执行。这里的 Groovy 语法和Kotlin 一样。

3.4 数据类型

在开发中我们定义对应的变量,肯定离不开对应的数据类型。在我们熟悉的Java中,我们所使用的基本数据类型都会有装箱拆箱的操作,比如说。

  • 基本数据类型

    byte、short、int、long、float、double、char、boolean

  • 包装类(装箱、拆箱)

    String、Byte、Short、Integer、Long、Float、Double、Char、Boolean

而在Groovy中,因为它具有动态类的特性,所以它从一开始就支持自动装箱实际上,必要时Groovy会自动将基本类型视作对象

3.5 字符串

Java大家都再熟悉不过了,后面就直接开始贴Groovy的代码。

def name = 'carName'
def realName = "$name:AAAA"
println name.getClass()
println realName.getClass()
def string='''
carName
is
$name
'''
println string

运行效果

class java.lang.String
class org.codehaus.groovy.runtime.GStringImplcarName
is
$nameProcess finished with exit code 0

从这里可以看出:

  • 单引号字符串是java.lang.String类型,同时不支持插值
  • 双引号字符串在没有使用插值表达式情况下是java.lang.String类型, 但如果有插值表达式使用的话,就是groovy.lang.GString类型
  • 三引号字符串表示多行的字符串。不必将字符串分割成几块,也不必用连接符或换行符转义字符来将字符串跨行

3.6 数组和列表

def array = ["1", "2", 3]
println array.getClass()
// int []
String[] array2 = ["1",new Object(),2, "3"]
//def array2 = [1, 2, 3] as int[]
println array2.getClass()println array2[1].toString()
println array2[1].getClass()

可以看出,这里定义了一个集合和一个数组,在集合和数组里面,我故意放入了不同类型的数据,代码也没有报错,我们运行看看效果。

class java.util.ArrayList
class [Ljava.lang.String;
java.lang.Object@3b4ef7
class java.lang.String

由此我们可得:

  • 数组和列表都是使用逗号分割列表的值,使用方括号括起来表示
  • Groovy中的数组和列可以随意转换
  • def定义的变量会自动推断 [ ] 类型是列表
  • Groovy列表是普通的JDK java.util.List,因为Groovy中没有定义自己的集合类

3.7 范围

范围是一种特殊的列表,由序列中的第一个和最后一个值表示,Range可以是包含或排除。包含范围包括从第一个到最后一个的所有值,而独占范围包括除最后一个之外的所有值。

(0..2).forEach{println it+"\t haha"
}
('a'..<'d').forEach{println it
}def range = 0..10
println range.getClass()

运行效果

0     haha
1    haha
2    haha
a
b
c
class groovy.lang.IntRange
Process finished with exit code 0

由此我们可得:

  • 1…10 包含范围的示例
  • 1…<10 独占范围的示例 (开区间)

3.8 映射

映射(也称为关联数组,字典,表和散列)是对象引用的无序集合。Map集合中的元素由键值访问。Map中使用的键可以是任何类,如果不能推断具体key类型,默认就是字符串。

在Groovy中可以使用特定的表述方式来指定映射

// [k1:v1,k2:v2]
def map = [a: 11, b: 12]
map.forEach { k, v ->println "key=${k.class} , value=$v"
}def value = map['a']
println value

运行效果

key=class java.lang.String , value=11
key=class java.lang.String , value=12
11

由此我们可得:[k1:v1,k2:v2] 具有键值对的集合。

4. 结束语

到这,这篇文章差不多结束了,相信看到这里,你应该大致了解了Gradle及自动化构建对应的发展和作用以及Groovy的基本语法。在下一篇中将会重点讲解Groovy的类与方法

Android 了解Gradle及自动化构建相关推荐

  1. Android 通过python实现自动化构建打包上传加固

    Android 通过python实现自动化构建打包上传加固 实现需求: 基于gradle命令,通过python实现多渠道,多环境打包,上传蒲公英,360加固等 经过学习调研完成步骤如下: 一,通过gr ...

  2. Android Jenkins + gradle 实现自动化打包流程并上传至蒲公英平台全过程

    最近在windows上尝试了jenkins持续集成环境搭建,把自己的写的app进行了自动化打包上传的一套流程,下面把我的经验分享给大家. 本文大纲: 说明:本文以windows为例 环境准备 jenk ...

  3. [凡文]Docker+Jenkins+Gradle+GitLab在Linux服务端自动化构建Android包

    概述 在linux服务器上安装docker和jenkins,项目仓库在搭建的gitlab私服上,然后在windows或者mac上编写项目,最后push代码到gitlab指定分支时,触发jenkins去 ...

  4. 暴力突破 Gradle 自动化项目构建(八)- Android 对 Gradle 的扩展:Variants、Transform

    一.前言 上一篇学习了如何自定义 Gradle 插件,本篇我们来学习下 Android 对 Gradle 的扩展:Variants(变体)以及 Transform.通过扩展可以让我们在自定义 Grad ...

  5. 用Jenkins自动化构建Android和iOS应用

    背景 随着业务需求的演进,工程的复杂度会逐渐增加,自动化的践行日益强烈.事实上,工程的自动化一直是我们努力的目标,能有效提高我们的生产效率,最大化减少人为出错的概率,实现一些复杂的业务需求应变. 场景 ...

  6. Android Studio Gradle构建脚本

    Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 构建工具就是对你的项目进行 ...

  7. Android Studio Gradle实践之多渠道自动化打包+版本号管理

    转: Android Studio Gradle实践之多渠道自动化打包+版本号管理 上次介绍了Android Studio的安装.配置和基本使用.这次讲一下Android Studio用到的打包工具G ...

  8. 解放双手——Android的自动化构建及发布

    在一个App从开发到测试的过程中,我有很长一段时间都是这样做的:打包,上传到tower,在tower上编写本次更新说明,通知测试.一般情况下,打包及上传的过程大概也就2分钟.除此之外,由于项目代码有作 ...

  9. 怎么用python编写个apk_【android】如何利用python做Android项目自动化构建,并一键实现构建结果发送到钉钉通知以及通过二维码下载apk或者其他处理等功能...

    今天我们来谈一谈用python做Android项目自动化构建的过程.我们知道在常规的Android开发过程中,开发人员打包的时候需要在Android Studio当中进行,或者通过gradle命令,但 ...

最新文章

  1. 工业工程专业C语言,工欲善其事必先利其器——工业工程课程设置及其核心专业课简介...
  2. wxWidgets:从文件中读取文本
  3. oracle的asmcmd获取归档日志,分析oracle的联机日志和归档日志
  4. 860. 柠檬水找零 golang
  5. Django+Vue前后端分离项目的部署
  6. Android Studio Gradle构建脚本
  7. 【Text_Classification】学习到的语法知识
  8. win32 串口阻塞的方式发送接收数据
  9. DenyHosts安装及配置
  10. 2020 及以后的八大最显著技术趋势!
  11. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
  12. 实习成长之路:MySQL四:深入浅出索引
  13. ICML 2022 | 稀疏双下降:网络剪枝也能加剧模型过拟合?
  14. 串口总线舵机之舵机命令
  15. SpringBoot集成MyBatis操作Mysql(极速体验版)
  16. 自己对PID一些学习总结
  17. 云计算、社交网络和移动互联网
  18. 在cshtml文件中使用预编译语法
  19. Git三板斧【linux环境】
  20. 必读的AI和深度学习博客

热门文章

  1. Android内存优化(二)系统进程之logd的native memory优化
  2. 机床外观设计要花多少钱?
  3. 达梦数据库DM8--学习笔记(麒麟v10+dm8)
  4. C语言入门系列之6.一维和二维数组
  5. 今天看到“勃客郑渊洁”,是我的偶像
  6. Java解析 PDF
  7. 蓝眼睛和红眼睛的数学问题_在设计眼睛数学时
  8. 用友U8C U8Cloud U8 cloud u8c V2.1 2.2 V2.3 V2.4 V2.5 V2.6 V2.7 V3.0 3.1 3.2文件下载
  9. 音频处理基础入门笔记
  10. 计算机毕设(附源码)JAVA-SSM基于Web学术会议投稿管理系统