文章目录
- 一、Gradle及Groovy简介
- 1、Gradle及自动化构建
- (1)Gradle介绍
- (2)为什么要学习Gradle
- (3)关于项目构建
- (4)安卓自动化构建发展史
- (5)Gradle提供了什么
- 2、Groovy介绍
- (1)Groovy简介
- (2)Groovy&Java&Kotlin
- (3)Groovy特性
- (4)Hello Groovy
- 二、Groovy基础到进阶
- 1、Groovy基础
- (1)数据类型
- (2)字符串
- (3)范围
- (4)映射
- (5)运算符及控制语句
- 2、Groovy进阶
- (1)Groovy动态特性
- (2)Groovy元编程
- (3)MOP方法拦截
- (4)MOP方法注入
- (5)MOP方法合成
- (6)MOP方法委托
目录:
1、Gradle及Groovy简介
2、Groovy基础到进阶
3、Gradle入门
4、Gradle构建
5、Gradle任务
6、Gradle插件
7、自定义Android Gradle工程
8、Android Gradle多项目构建
9、Android Gradle多渠道构建
10、Android Gradle测试
11、Android Gradle持续集成
一、Gradle及Groovy简介
1、Gradle及自动化构建
(1)Gradle介绍
Gradle是一款基于Apache的Ant和Maven概念的
项目自动化开元构建工具
。Gradle的核心是基于Java来实现的,可以把Gradle看成就是一个轻量级的Java应用程序
Gradle使用Groovy、Kotlin等语言编写自定义脚本
,取代了Ant和Maven使用xml配置文件的方式,很大程度简化了开发时对项目构建要做的配置,使用更加灵活和强大。
(2)为什么要学习Gradle
Gradle不仅是目前Android最主流的构建工具。而且不少技术领域如组件化、插件化、热修复,及构建系统(很多优秀的框架都是在编译时或者打包之前做一些特殊的处理),都需要通过Gradle来实现,不懂Gradle将无法完成上述事情,所以学习Gradle非常必要
很多人都了解过这个APT,就是注解处理器,就是在编译时去生成一些代码,这就是一个Gradle和APT的一个使用了。有一些框架还打包成Gradle插件,通过插件在编译之后去修改class字节码的。目的是在应用运行前就把代码执行好,提升应用使用时的运行速度,所以它不仅仅是一个项目依赖管理的工具
(3)关于项目构建
对于Java应用程序,编写好的Java代码需要编译成.class文件才能够执行。所以任何的Java应用开发,最终都需要经过这一步。
编译好了这些class文件,还需要对其进行打包。打包不仅针对这些class文件,还有所有的资源文件等。比如web工程打包成jar包或者war包就包含了自己的资源文件,然后放到服务器上运行。(就是对资源进行整理,然后放到某一个路径下方便我们去使用)
Android工程编译好的class文件还要被打包到dex包中,并且所有的资源文件进行合并处理,甚至还需要对最终打爆出来的文件进行加密和签名处理等等,如下图所示
后面的是签名和apk加固的过程,早在13年14年,那时候没有apk加固,所以那些搞逆向开发的只要拿到apk,就可以轻松破解然后看到里面的目录结构,可以进行修改里面的代码,现在搞逆向的就比较困难了。
(4)安卓自动化构建发展史
“石器时代”: 自己编写命令脚本,进行编译和打包
“蒸汽时代”: Make(.mk)、Ant(.xml)工具的出现
“电气时代”: Maven
“信息时代”: Gradle,更高级的自动构建工具出现。。。
你们的Gradle可能用了两年 还是没有变,可能还在怪Android Studio,Android Studio没有办法了,出了一个策略,就是那个最低支持几点几版本的Gradle。 其实Gradle配置文件就是一个 闭包,就是一个方法的调用java">ext{ // AA }
java">rootProject.ext{ // ... }
(5)Gradle提供了什么
- 对多工程的构建支持非常出色,尤其是工程依赖问题,并支持局部构建
- 多种方式的依赖管理:如远程Maven仓库,nexus私服,ivy仓库活着本地文件系统等。
- 支持传递性依赖管理
- 轻松迁移项目工程
- 基于Groovy等语言构建脚本,简便且灵活
- 免费开源,并且
整体设计是以作为一种语言为导向的
,而非成为一个严格死板的框架。
比如maven 的写法,xml都是需要被解析的,解析成能够执行的代码,而且不够灵活
而Gradle,这就是一个可以执行的脚本文件
2、Groovy介绍
(1)Groovy简介
Groovy是一种基于JVM的
敏捷开发语言
,它结合了python、Ruby和Smalltalk的许多强大的特性,Groovy代码能够与Java代码很好的结合,也能用于扩展现有代码。由于其运行在JVM上的特性,Groovy也可以使用其他非Java语言编写的库
(2)Groovy&Java&Kotlin
Groovy、Java及Kotlin都是基于JVM的开发语言
Groovy基于Java,在语法上基本相似,但也做了很多自己的扩展。Groovy除了可以面向对象编程,还可以用作纯粹的脚本语言,这一点和Kotlin是一样的。
Groovy和 Kotlin都有自己支持的DSL(领域专用语言),两者有许多共通之处
(3)Groovy特性
- 同时支持静态类型和动态类型
- 支持运算符重载
- 支持DSL语法特性
- 本地语法列表和关联数组
- 各种标记语言,如XML 和 HTML原生支持
- 对正则表达式的本地支持
- Groovy和Java语法非常相似,可以无缝衔接使用Java
- 支持使用现有的Java库,并做了一定的扩展
Groovy:闭包、MOP编程(元编程)
(4)Hello Groovy
Groovy 与 Java写法上的一些差异:
分号可选,除非会导致语法歧议时才使用分号
return 语句可选
方法,属性默认都是public的
Groovy不强迫捕获异常,看使用者需求
?, 安全导航操作符的使用
闭包的使用结合DSL语法特性等等
实战建一个Groovy项目:
如果你用idea新建一个项目遇到报错问题,这里给你答案:
intellij 编译groovy报错问题解决
编译结果:
二、Groovy基础到进阶
1、Groovy基础
(1)数据类型
基本数据类型:
- byte、short、int、long 、float、 double、 char、boolean
包装类(装箱拆箱):
- String、Byte、Short、Integer、Long、Float、Double、Char、Boolean
自动装箱:因为Groovy具有动态类型特性,所以它从一开始就支持自动装箱。实际上,必要时Groovy会自动将基本类型视作对象。
(2)字符串
- 单引号字符串是java.lang.String类型,同时不支持插值
- 双引号字符串在没有使用插值表达式情况下是java.lang.String类型,但如果有插值表达式使用的话,就是groovy.lang.CString类型
- 三引号字符串表示多行的字符串,不必将字符串分割成几块,也不必用连接符或换行转译字符来将字符串跨行
- 字符串的使用:
- 单引号单个字符表示char类型,需要使用as转换
- ${…}表达式进行插值,去掉花括号不引起歧义的话,可以去掉
- 可以通过+=,-=操作符添加/减少字符(会自动匹配)
(3)范围
范围是一种特殊的列表,由序列中的第一个和最后一个值表示,Range可以是包含或排除。包含范围包括从第一个到最后一个的所有值,而独占范围包括除最后一个之外的所有值。也可以使用表达式来表示范围,例如:
- 1…10 包括范围的示例;
- 1…<10 独占范围的示例(开区间)
- ‘a’ … ‘x’ 范围也可以由字符串组成;
- 10…1 范围也可以按降序排列
- ‘x’…‘a’ 范围也可以由字符组成并按降序排列。同步/异步请求实现 。
(4)映射
映射(也称为关联数组,字典,表和散列)是对象引用的无序集合。Map集合中的元素由键值访问。Map中使用的键可以是任何类,如果不能推断具体key类型,默认就是字符串。
在Groovy中可以使用特定的表述方式来指定映射:
- [k1:v1,k2:v2] 具有键值对的集合
[:] 空映射
(5)运算符及控制语句
Groovy支持运算符重载
循环语句:
- 除了和Java保持差不多的用法外,还支持结合范围的用来进行循环。
- 组合闭包来实现更简化的循环操作
条件语句:
- 除了和Java保持差不多的用法外,还多了Groovy的一些扩展
- 可以组合闭包实现更灵活的条件语句
2、Groovy进阶
(1)Groovy动态特性
动态/静态类型语言
动态类型语言:动态类型语言是指
在运行期间才去做数据类型检查的语言
,也就是说,在用动态类型的语言编程时,可以不用给变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby这些就是一种典型的动态类型语言。
静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译期间检查的
,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的代表,其他的静态类型语言还有C#、Java等
Groovy的动态特性
使用def定义变量,类型由运行时对其赋值的类型类确定。
Java中要使用继承才能实现多态,而Groovy轻而易举
- 优势:使用时非常灵活
- 缺点:编译时不会检查类型,运行时报错,需要更加注重细节
可以使用MOP进行元编程
(2)Groovy元编程
- Java中可以通过反射,在运行时动态的获取类的属性,方法等信息,然后反射调用。但是没法直接做到往类中添加属性、方法和行为。(需要通过动态字节码技术如ASM、javassist等技术来实现动态的修改class)
- MOP(元对象协议): Meta Object Protocol
- Groovy直接可以使用MOP进行元编程,我们可以基于应用当前的状态,动态的添加或者改变类的方法和行为。比如在某个Groovy类中并没有实现某个方法,这个方法的具体操作由服务器来控制,使用元编程,为这个类动态添加方法,或者替换原来的实现,然后可以进行调用。
(3)MOP方法拦截
实现GroovyInterceptable接口,重写invokeMethod来进行拦截。
使用MetaClass拦截方法,覆盖invokeMethod方法。
- 使用类的MetaClass,针对的是class对象,所有实例都会被影响。
- 使用具体实例的MetaClass,只影响当前对象实例
(4)MOP方法注入
方法注入:编写代码时知道想要添加到一个或多个类中的方法的名字。利用方法注入,可以动态地向类中添加行为。也可以向任意数目的类中注入一组实现某一特定功能的可复用方法,就像工具函数。有以下几种方式:
- 使用分类注入方法。
- 使用ExpandoMetaClass注入方法。
直接使用类或实例的MetaClass注入方法,实际上最终操作的类型是ExpandoMetaClass。
手动创建ExpandoMetaClass来进行注入- 使用Mixin注入方法。(在类中可以使用多个Mixin)
(5)MOP方法合成
方法合成:想在调用时动态地确定方法的行为。Groovy的invokeMethod()、methodMissing()和Groovy Interceptable对于方法合成非常有用
- 使用methodMissing()合成方法。
- 使用ExpandMetaClass合成方法。
(6)MOP方法委托
使用Expando动态生成动态类。
使用methodMissing实现方法委托。