AS中Gradle干了些什么

前言

相信大家在做Android项目的时候总会遇到一些在构建方面的问题。比如编译了好几个小时还是不成功,不知道哪里出现问题,只能再试一遍。

编译的时候出现问题只知道把报错复制然后去Google,有些搜的到,点进去看了半天不知道什么意思,只能硬着头皮把博客里讲的解决方法自己搞一遍,原理不知道,成功了还好,失败了只能继续找。那搜不到的怎么办,可能是bug,或者可能是xuanxue了。
“那看完这篇博客能让我不再遇到这些问题吗?” “不能”
“那我能学会怎么解决这些问题吗?” “不能”
“那我能看懂那些博客里写的解决方法吗?” “不一定”
“那我能学会什么?” “。。。”

Gradle基础介绍

Projects 和 tasks

Gradle 里的任何东西都是基于这两个基础概念:

  • projects ( 项目 )
  • tasks ( 任务 )
    每一个构建都是由一个或多个 projects 构成的. 一个 project 到底代表什么依赖于你想用 Gradle 做什么. 举个例子, 一个 project 可以代表一个 JAR 或者一个网页应用. 它也可能代表一个发布的 ZIP 压缩包, 这个 ZIP 可能是由许多其他项目的 JARs 构成的. 但是一个 project 不一定非要代表被构建的某个东西. 它可以代表一件要做的事, 比如部署你的应用.

每一个 project 是由一个或多个 tasks 构成的. 一个 task 代表一些更加细化的构建. 可能是编译一些 classes, 创建一个 JAR, 生成 javadoc, 或者生成某个目录的压缩文件.

我们来看看在android项目里,Gradle为我们自动生成了哪些Projects 和 tasks

  1. 命令 ./gradlew [-q] projects
liujl@liujl-VivoBook-S15-X510UF:~/ASProjects/clone/GradleDemo$ ./gradlew -q projects
# project build.gradle

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'GradleDemo'
\--- Project ':app'

To see a list of the tasks of a project, run gradlew <project-path>:tasks
For example, try running gradlew :app:tasks

在这里插入图片描述

注:为什么可以使用 ./gradlew 这个命令

  • 如果电脑上安装了Gradle,可以使用Gradle这个命令,但是android项目是有对应的gradle版本要求,不过不一致是会报错的
  • 为了解决这个问题,引入了Gradle WrapperGradle Wrapper可以通过配置文件的方式自动帮我们下载对应版本号的Gradle。相关的文件有:gradle-wrapper.propertiesgradlewgradlew.bat
    • gradle-wrapper.properties: 这个是gradle wrapper的配置文件,在这里规定了gradle的下载地址,和对应的版本号
    • gradlewgradlew.bat:分别为linux和windows下的可执行脚本文件
    • 所以可以通过 ./gradlew 的方式来替代 gradle 命令执行
  1. 命令 ./gradlew -q tasks
    显示root project下的所有task,以下是部分task:
# project build.gradle

------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Android tasks
-------------
androidDependencies - Displays the Android dependencies of the project.
signingReport - Displays the signing info for the base and test modules
sourceSets - Prints out all the source sets defined in this project.

所有的task可以点击Android studio右边的gradle 查看
这里的tasks都是gradle和Android Gradle Plugin为我们创建好的,可以直接使用。
在这里插入图片描述

  1. 命令 ./gradlew -q app:properties

这个命令是展示指定项目里面的所有属性
属性:参数,有属性名和属性值

例:rootProject.name = "GradleDemo"
所以gradle自动生成的文件中只有settings.gradle这个文件中使用了属性,就是上面这个例子。

include (':app')
rootProject.name = "GradleDemo"

在自动生成的几个和Gradle相关的文件中,和gradle wrapper相关的,加上settings.gradle 已经提到了
还剩下两个 build.gradle 文件没有提到

这里有一篇博客详细介绍了 build.gradle 里面的所有东西:https://blog.csdn.net/hebbely/article/details/79074460

因为上面的博客里面已经对build.gradle里面的内容进行详细的说明,下面将从语法的角度来分析 build.gradle

Gradle是用了一种基于Groovy的领域特定语言(DSL,Domain Specific Language)来声明项目设置,摒弃了XML(如ANT和Maven)的各种繁琐配置。
groovy和java语言有很多类似的地方,也可以直接使用java,和kotlin很像。
可以作为Java平台的脚本语言使用,Groovy代码动态地编译成运行于Java虚拟机(JVM)上的Java字节码,并与其他Java代码和库进行互操作。由于其运行在JVM上的特性,Groovy可以使用其他Java语言编写的库。Groovy的语法与Java非常相似,大多数Java代码也符合Groovy的语法规则,尽管可能语义不同。

groovy和java最大的不一样的地方就是闭包(closure)

闭包简介

闭包的语法很像java里面的lambda表达式,但本质是不一样的

闭包就是一串代码,这串代码有点像一个方法,有参数,有方法体,没有方法名,但是它可以被赋值给一个变量

def isOdd = { int i -> i % 2 != 0 }
  • 如何定义一个闭包:
{} // 接收一个参数,空执行语句

{ ++it } // 接收一个参数,默认it

{ -> println('no param')} // 没有参数,必须写->

// 可以声明参数类型
{ String x, int y -> println("x is ${x}, y is ${y}") }

// 可以省略参数类型
{ x, y -> println("x is ${x}, y is ${y}") }

// 一个参数,多行执行语句
{ x ->
    int y = -x
    println("-x is ${y}")
}

java的lambda表达式:

()->{
    System.out.println();
}

a->{
    System.out.println(a);
}

(s, i) -> {
    System.out.println(s + i);
}

在语法上有几点不一样:

  1. 当只接受一个参数的时候,groovy可以用it来替代
  2. groovy的参数写在大括号里面,lambda表达式写在大括号外面

Groovy 的闭包可以附在一个方法上或者赋值给一个变量。示例中变量 closure 就保持了一个指向闭包的引用。使用 pickOdd 方法的时候传入包含不同逻辑的闭包方法块即可。

def pickOdd(n, closure) { // 此处的closure可以换成别的参数名
    for (int i = 1; i <= n; i += 2) {
        // 执行逻辑都由传入的闭包决定
        closure(i)
    }
}

这里定义了一个方法,第二个参数是一个闭包。下面用两种方法来传入闭包

//1. 附在一个方法上
// 打印奇数
pickOdd(9) {
    println it // 下文会详细介绍it
}

//2. 赋值给一个变量
// 求和
total = 0
pickOdd(9, {
    num -> total += num // 可以访问total变量
})
println("Sum of odd is: ${total}")

理解了闭包之后,再去看看build.gradle

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

这串代码应该算是android开发者见的最多的一串了,也非常了解,所以利用这一段代码来解释groovy的语法。
按住电脑的ctrl键,将鼠标移到dependencies上,发现这是一个方法,传递的是一个Closure参数。
后面的大括号及里面的代码就是一个闭包,闭包在jvm编译的时候会映射成java里面的Closure对象。
这个闭包由dependencies这个方法来确定什么时候调用。

implementationtestImplementationandroidTestImplementation也是方法,需要传递一个参数,就是后面的依赖包名。
将其转化为java的语法格式也是可以编译成功的

implementation('androidx.appcompat:appcompat:1.1.0')

以上是结合android studio的一些gradle和groovy的基础内容,如果想要能够掌握解决问题的能力还是要去系统的学习Gradle

参考:
Gradle系列(二):AndroidStudio的Gradle简介: https://www.jianshu.com/p/2350c1559b11
Groovy 的闭包: https://juejin.im/post/5ccd2ee7e51d453a4a357e3f#heading-4
build.gradle详解: https://blog.csdn.net/hebbely/article/details/79074460
Gradle User Guide 中文版: http://wiki.jikexueyuan.com/project/GradleUserGuide-Wiki/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值