Android-Gradle(1)-概念及基础,看完老板就给加薪了

GradleandroidStudio项目中存在的痕迹如下图(这是一个新建的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及笔记,如若皆是你所需要的,那么都可发送给你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值