Android Gradle学习(一)


目录:
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配置文件就是一个 闭包,就是一个方法的调用

ext{
 // AA
}
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实现方法委托。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值