美文网首页延后2
深入学习Gradle(一) Gradle配置⽂件拆解

深入学习Gradle(一) Gradle配置⽂件拆解

作者: 不思进取的码农 | 来源:发表于2021-06-09 01:10 被阅读0次

    gradle 是什么

    • 是构建⼯具,不是语⾔
    • 它⽤了 Groovy 这个语⾔,创造了⼀种 DSL,但它本身不是语⾔

    怎么构建?

    • 按照 gradle 的规则(build.gradle、settings.gradle、gradle-wrapper、gradle
      语法)

    闭包

    • Java 的 Lambda 表达式:是单抽象⽅法(SAM)的接⼝的匿名类对象的快捷写
      法,只是⼀个语法糖。
    • Kotlin 的 Lambda 表达式:和匿名函数相当,实质上是⼀个函数类型的对象,
      并不只是语法糖。
    • Groovy 的 Lambda 表达式:Groovy ⾥不叫「Lambda」表达式,⽽是叫「闭
      包」;在功能上,和 Kotlin 的 Lambda ⽐较相似,都是⼀个「可以传递的代码
      块」,具体的功能⽐ Kotlin 的 Lambda 更强⼀些,但基本的概念是⼀样的。

    为什么 Groovy 可以写出类似 JSON 格式的配置?

    因为它们其实都是⽅法调⽤,只是⽤闭包来写成了看起来像是 JSON 型的格式

    buildTypes 和 productFlavors

    • buildTypes
      在创建项目的文件中已经创建了buildTypes了,里面包含了一些release的配置,即我们发布apk的配置(主要是混淆文件)。我们也可以创建一个debug的版本的配置,使用默认的签名证书,通过Build Variant就可以看到


      Build Variant

    总结来说:主要就是配置发布版本和测试版本的一些配置以及混淆文件

    • productFlavors

    productFlavors直译为:产品的偏好.productFlavors是在buildTypes之外的纬度的分配.看起来和buildTypes的作用很像,但是他可以做更多维度
    从维度的角度:免费版/付费版 国内版/国外版 渠道包等

    flavorDimensions 'paid', 'country'
        productFlavors {
            free {
                dimension "paid"
            }
            paid {
                dimension "paid"
            }
            china {
                applicationId "com.example.china"  //动态配置包名
                dimension "country"
                buildConfigField "String" , "APP_URL" , "http://www.china.com" //给不同版本配置不同域名
               buildConfigField "String" , "APP_NAME" , "小熊维尼" //不同维度不同名称
            }
            usa {
                applicationId "com.example.usa" //动态配置包名
                dimension "country"
               buildConfigField "String" , "APP_URL" , "http://www.usa.com" //给不同版本配置不同域名
                buildConfigField "String" , "APP_NAME" ,  "Winnie the Pooh"'//不同维度不同名称
            }
    
    

    compile, buildTypesimplementation 和 api

    • implementation:不会传递依赖
    • compile / api:会传递依赖;api 是 compile 的替代品,效果完全等同
    • 当依赖被传递时,⼆级依赖的改动会导致 0 级项⽬重新编译;当依赖不传递
      时,⼆级依赖的改动不会导致 0 级项⽬重新编译

    Gradle Wrapper

    • 通过「只同步版本,不同步⽂件」的⽅式来减⼩协作项⽬的⼤⼩
    • 每个⼈电脑上的 Gradle 存放在固定位置,然后使⽤ Gradle Wrapper 的配置来
      取⽤对应的版本就⾏了

    task

    • 使⽤⽅法:./gradlew taskName
    • task 的结构:
    task taskName {
      初始化代码
      doFirst {
      task 代码
      }
      doLast {
      task 代码
      }
    }
    
    • doFirst() doLast() 和普通代码段的区别:
      (1) 普通代码段:在 task 创建过程中就会被执⾏,发⽣在 codoFirst() 和 doLast():在 task 执⾏过程中被执⾏,发⽣在 段。如果⽤户没有直接或间接执⾏ task,那么它的 doLa不会被执⾏

      (2) doFirst() 和 doLast() 都是 task 代码,其中 doFirst() 是往码,doLast() 是往队列的后⾯插⼊代码

    • task 的依赖:可以使⽤task taskA(dependsOn: b) 的指定依赖后task 会在⾃⼰执⾏前先执⾏⾃⼰依赖的 task。

    gradle 执⾏的⽣命周期

    三个阶段:

    • 初始化阶段:执⾏ settings.gradle,确定主 project 和⼦ project
    • 定义阶段:执⾏每个 project 的 bulid.gradle,确定出所有 task 所组成的有向⽆
      环图
    • 执⾏阶段:按照上⼀阶段所确定出的有向⽆环图来执⾏指定的 task

    在阶段之间插⼊代码:

    • ⼀⼆阶段之间:
      settings.gradle 的最后
    • ⼆三阶段之间:
    afterEvaluate {
      插⼊代码
    }
    

    相关文章

      网友评论

        本文标题:深入学习Gradle(一) Gradle配置⽂件拆解

        本文链接:https://www.haomeiwen.com/subject/gbmrsltx.html