Android Gradle学习(一)

news/2024/5/20 1:15:45 标签: android, java, gradle, groovy

文章目录

  • 一、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实现方法委托。


http://www.niftyadmin.cn/n/793646.html

相关文章

Android Room 数据库常见报错missing database

常见错误1&#xff1a; D:\AndroidProjectsDemo\JetpeckTest\app\build\tmp\kapt3\stubs\debug\com\example\jetpecktest\room\BookDao. java:15: 错误: There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: BookEntity) publ…

关于Android 的ViewBinding和<merge>标签冲突的问题解决

我们在使用include的时候给被引入的布局添加一个id&#xff0c;如下所示&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"…

关于小狐狸版本的AS,编译报错 repository ‘Google‘ was added by build file ‘build.gradle问题完美解决

错误关联&#xff1a;Failed to resolve: 、 repository ‘Google’ was added by build file build.gradle 首先我导入一个库后编译项目遇到这样的问题&#xff1a; 出现Failed to resolve: com.github.chrisbanes:PhotoView的问题&#xff0c; 你们的工程可能报各种库的问题&…

Android Gradle学习(二)

Gradle学习二一、Gradle构建机制1、settings.gradle2、顶层构建文件&#xff1a;build.gradle3、模块的构建文件&#xff1a;build.gradle&#xff08;1&#xff09;插件&#xff08;2&#xff09;Android&#xff08;3&#xff09;依赖包4、Daemon&#xff08;守护进程&#x…

可能是最详细的Android图片压缩原理分析(一)—— Android图片压缩必备基础知识

本篇文章已授权微信公众号guolin_blog&#xff08;郭霖&#xff09;独家发布 稀土掘金链接 前言&#xff1a; 最近在研究图片压缩原理&#xff0c;看了大量资料&#xff0c;从上层尺寸压缩、质量压缩原理到下层的哈夫曼压缩&#xff0c;走成华大道&#xff0c;然后去二仙桥&am…

可能是最详细的Android图片压缩原理分析(二)—— 鲁班压缩算法解析

本篇文章已授权微信公众号guolin_blog&#xff08;郭霖&#xff09;独家发布 稀土掘金链接 前言 通过上一篇&#xff0c;我们了解了一些关于图片压缩的基础知识&#xff0c;这篇文章我们主要讲解一下鲁班压缩的算法逻辑&#xff0c;很多博客都是从Github上将人家的介绍直接拷贝…

可能是最详细的Android图片压缩原理分析(三)—— 底层哈夫曼压缩讲解

本篇文章已授权微信公众号guolin_blog&#xff08;郭霖&#xff09;独家发布 稀土掘金链接 前言 在前面的 Android图片压缩必备基础知识 中&#xff0c;提到的Skia是Android的重要组成部分。在鲁班压缩算法解析中提到哈夫曼压缩&#xff0c;那么他们之间到底是什么关系呢&…

可能是最详细的Android图片压缩原理分析(四)—— 大图加载优化(防止OOM)

前言&#xff1a; 这个还没写完&#xff0c;之后写完会进行更新。 系列教程 可能是最详细的Android图片压缩原理分析&#xff08;一&#xff09;—— Android图片压缩必备基础知识 可能是最详细的Android图片压缩原理分析&#xff08;二&#xff09;—— 鲁班压缩算法解析 可…