Gradle
在androidStudio
项目中存在的痕迹如下图(这是一个新建的project
):
上面图中,上图中,我标记了1-6,现在来一一解释:
1. Gradle- Wrapper
gradle的包装盒,里面有gradle的jar包,还有properties属性. Jar包包含的是.class文件,这也就解释了为什么gradle的代码是基于JVM的,可以预见,这个jar包内肯定包含了gradle编译之后生成的java类,各种api. 然而,事实也证明我的猜想没有错。
Jar包之外,还有一个.properties.
这里是gradle的一些配置信息,比较重要的是最后一条,distributionUrl
它代表了gradle
工具包的下载路径.
2. 外部的build.gradle
它是全局范围的构建配置.
3. setting.gradle
但是这里不仅仅可以定义要编译的module,还可以进行插件化编程。
4. gradle.properties
gradle的全局配置
5. gradlew 和 gradlew.bat
这两个,是不同平台下的可执行文件,前者是 .sh格式,希尔文件,linux下的可执行文件。后者是 window下的批处理命令。
###6. module内部的build.gradle
综上所述
Gradle是贯穿了整个android工程的构建工具,几乎随处可见gradle的身影,作为高级开发者,如果只知道android的java代码,写写xml,而不懂得gradle编程的话,开发中遇到某些问题(
特别是架构方面的问题
),很可能不知所措。
2. groovy语言的特性以及它和java的关系
Gradle
的常用编程语言有java,groovy,kotlin,scala
等,但是最常见的,谷歌默认的构建语言,还是groovy
.
那么, 了解groovy
语言的特性是绕过不去的。
但是精(熟)通(练)Java的开发者,groovy和java
都是基于jvm
,都是编译成字节码来运行在jvm
中,我们在有java老底
的基础上,不需要逐字逐句去学习语法,而只需要总结出groovy和java
语法上比较相异的部分,则可以轻松掌握它。
先给出Groovy
语法的官网:
https://www.w3cschool.cn/groovy/groovy_basic_syntax.html
大部分语法,我们作为java开发者都能看懂,但是以下这些,则需要动一下脑子。
1.语句结束的逗号可以省略
但是你要加上也不会报错,建议能省就省吧
2. 导包
Groovy的导包方式和java一样:import java.lang.*
,但是.gradle内会有默认导包。每一个xxx.gradle文件,都能
不用导包而直接使用以下包的类。
import java.lang.*
import java.util.*
import java.io.*
import java.net.*
import groovy.lang.*
import groovy.util.*
import java.math.BigInteger
import java.math.BigDecimal
3. 定义变量
除了java所支持的 String a = "aaa"
,之外,它还可以def a = "aaaa"
String s = "aaaaa"
def s2 = "ssssss"
4. 循环
for (int i in 1..10) {//用for in 遍历 1到10(包含头尾)
println i
}
def dd= [1,2,3,4,5]//for in 遍历数组
for(d in dd){
println d
}
def map = ["ken":21,"ju":12,"aaaaa":223] // for in 遍历 map
for(d in map){
println d
}
另外,如果是简单的多次执行同一段代码,还可以这么写(这个涉及到闭包,后面解释):
10.times {
variable -> println variable
}
5.文件IO
除了可以使用java的标准io流
去进行文件读写之外,还使用Groovy
可以进行文件的IO
读写操作,后者更加简单.比如
new File("test.txt").eachLine { line -> println "line $line" } //读取每一行
//读取文件全部内容
File f = new File("test.txt")
println "文件全部内容 \n$f.text"
//把helloWorld字符串写入到test.txt文件
new File("test.txt").withWriter('utf-8', {
writer -> writer.writeLine("hello world")
})
总之一句话,Groovy
提供的 File类
,可以进行简单的文件操作,足够满足我们平时的gradle编程IO流操作,其他更多api可以翻阅 https://www.w3cschool.cn/groovy/groovy_file_io.html
6. 闭包
导致有些人看不懂.gradle文件的原因就是 闭包, 这个是java中不存在的概念(拉姆达表达式类似闭包,但是不是闭包
).可以大致理解 为: 闭包==匿名代码块
//闭包测试
def clo = { println("无参闭包") }//无参闭包
clo()
def clo1 = { a -> println("1个参数的闭包:" + a) }
clo1("参数")
def clo2 = { a, b, c -> println("多个参数的闭包 $a $b $c") }
clo2(1,2,3)
闭包也可以作为参数传递给一个方法:
task test() {
//闭包测试
def clo = { println("无参闭包") }//无参闭包
def clo1 = { a -> println("1个参数的闭包:" + a) }
def clo2 = { a, b,c -> println("多个参数的闭包 $a $b $c") }
//闭包作为参数
testClo(clo)
testClo1(clo1)
testClo2(clo2)
}
void testClo(Closure clo) {
println("=======开始测试闭包0咯=======")
clo()
}
void testClo1(Closure clo) {
println("=======开始测试闭包1咯=======")
clo("哈哈哈")
}
void testClo2(Closure clo) {
println("=======开始测试闭包2咯=======")
clo("啊1", 2, 3)
}
#####集合/映射+闭包
task test() {
def list = [1, 2, 3, 4, 5]
list.each { a -> println(a) }//指明形参名
list.each { println(it) } //使用默认的形参名it
def map = ["zhou": 22, "li": 30, "han": 40]
map.each { a -> println(a) }//指明形参名
map.each { a -> println(a.key + "- "+ a.value) }//指明形参名
map.each { println(it.key + "- "+ it.value) } //使用默认的形参名it
}
7. 省略小括号
除了闭包之外,groovy对于小括号的省略写法也是阻碍我们看懂gradle文件的原因。那么groovy在什么情况下可以省略小括号呢?
1. 所有的顶级表达式的括号可以省略
2. 当闭包作为顶级表达式的最后一个参数的时候,小括号可以省略但是,当函数嵌套调用的时候,如果函数是无参的,这个时候小括号不可省略.
什么意思?小括号的省略往往和闭包 / 方法调用有关,我们拿实际案例来说:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
上面这段,如果按照java的语言习惯,根本读不通,但是,如果我们把括号补全以下,变成这样:
buildscript({
repositories({
google()
jcenter()
})
dependencies({
classpath ('com.android.tools.build:gradle:3.4.1')
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
})
})
解读以上补全过程,通过代码阅读,我发现,buildscript / repositories /google/jcenter/dependencies / classpath 其实都是 一个一个的**“方法名”,方法自然是会带上小括号,小括号里面就会装着参数,而参数类型恰恰就是 闭包Closure,
最后一个classpath
比较特殊,他的参数类型是Object[]** :
比如
void buildscript(Closure configureClosure);
void repositories(Closure configureClosure);
补全了小括号,我们就能以java的阅读习惯去阅读gradle
文件。
再举一个例子(如果上面的能读懂,那么下面的这一段代码应该能读懂了):
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
## 结局:总结+分享
看完美团、字节、腾讯这三家的一二三面试问题,是不是感觉问的特别多,可能咱们真的又得开启面试造火箭、工作拧螺丝的模式去准备下一次的面试了。
开篇有提及我可是足足背下了**Java互联网工程师面试1000题**,多少还是有点用的呢,换汤不换药,不管面试官怎么问你,抓住本质即可!能读到此处的都是真爱,所以福利也为你准备,这份1000题免费送你!**[点击这里免费领取](https://codechina.csdn.net/m0_60958482/java-p7)**
* **Java互联网工程师面试1000题**
![image.png](https://img-blog.csdnimg.cn/img_convert/971a908076810329926683e37761d89d.png)
而且从上面三家来看,算法与数据结构是必备不可少的呀,因此我建议大家可以去刷刷这本左程云大佬著作的 《程序员代码面试指南 IT名企算法与数据结构题目最优解》,里面近200道真实出现过的经典代码面试题。
* **程序员代码面试指南--IT名企算法与数据结构题目最优解**
![image.png](https://img-blog.csdnimg.cn/img_convert/33e77993980f0a89f08cd88b23b8510f.png)
* 其余像设计模式,建议可以看看下面这4份PDF(已经整理)
![image.png](https://img-blog.csdnimg.cn/img_convert/f3b1778bb27cb5ea091bebfee9e491f1.png)
* 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。
![image.png](https://img-blog.csdnimg.cn/img_convert/698d7b2db1562429f45795d13d4b90e9.png)
优解**
[外链图片转存中...(img-0jxEegjn-1630121167854)]
* 其余像设计模式,建议可以看看下面这4份PDF(已经整理)
[外链图片转存中...(img-l1QB23Mi-1630121167855)]
* 更多的Java面试学习笔记如下,关于面试这一块,我额外细分出Java基础-中级-高级开发的面试+解析,以及调优笔记等等等。。。
[外链图片转存中...(img-vaRI1fYb-1630121167856)]
以上所提及的全部Java面试学习的PDF及笔记,如若皆是你所需要的,那么都可发送给你!