聊聊我对Gradle的浅薄认知

从我开始接触Android的时候,Eclipse作为Android开发的 主流ide的 时代已经结束了 ,随之而起的是基于JetBrains家的大名鼎鼎的Intelli  Idea的 AndroidStudio,从此整个Android项目 的构建 开始采用 Gradle。

初识:

Gradle 是项目构建 的脚本工具 ,拥有完整的语言支持,和丰富的三方库插件!信息显示Gradle是基于Ant 和Maven的更加优秀的构建 工具,要比 Ant跟 Maven的构建速度更快,Gradle支持增量构建,数据 显示Gradle的构建速度比Ant跟Maven快一倍以上。
Google官方 也一直在推荐使用Gradle来 构建大型项目,许多明星开源项目也 在支持 用Gradle来构建比如  SpringBoot

新建一个Android项目 ,切换到工程目录下我们 可以看到 android项目中到处都有Gradle的影子

但是说实话,第一次 用gradle  来构建项目的 时候 ,并没有 体会到 gradle有多优秀,因为 漫长的 构建 过程,早已使我丢失了 对 gradle深入 学习的乐趣,后来的后来 才发现原来是自己使用姿势不对 ,毕竟有些资源库是需要翻墙才能访问的,当然我们 也可以 使用国内的镜像 来访问,从而加快构建 速度 

工程角度:

       我们可以点开setting.gradle 这 个脚本 ,这个脚本是项目构建 的时候 最先执行到的地方,里面一般会有 inclue app xxx  xxx 之类的字眼,没错app是整个项目的核心入口 ,其他是android工程的library 或者module,所以若果想做一些基础的 初始化 操作,可以在 setting.gradle 里加入一些逻辑 。

       我们再看下整个项目的build.gradle这个脚本 ,一般是这样子的 

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath "com.android.tools.build:gradle:4.1.2"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

        我们 看到这里面有好多大括号 ,并不像我们认识的java里的那种比较规整的类文件 ,这对于动态类型的语言 并没有严格 的条框规定 ,大括号的 含着一些 代码段就有了闭包的概念,这在Kotlin中也比较常见,在Grrovy中也常见,

repositories{}这种闭包里是添加 项目依赖的三方库的地址,google()是谷歌的maven仓库地址 jcenter()是最大的 java开源库托管地址,但是看报道应该jcenter()后续可能也不维护了 ,dependencies{}闭包里是装着的是具体依赖的三方库的名字和版本号,这里是整个项目的构建文件,一般这里是并不会做太多的处理的 ,要 做修改的是我们的app目录下的的那个 build.gradle  文件,
plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30
    buildToolsVersion "30.0.2"

    defaultConfig {
        applicationId "com.example.myeventbusdemo"
        minSdkVersion 16
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'org.greenrobot:eventbus:3.2.0'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

这里依然 是一些闭包 ,里面的 东西都大同小异 ,真实的项目开发中这个文件 中的逻辑 还是 比较复杂的,我们看第一个 plugins{ } 闭包,这个里面是用来引用一些已经做好的三方的 gradle插件,比如有关 kotlin中直接使用id代表组件 的 id 'kotlin-android-extensions' 还有一些三方库的比如 bugly arouter之类的,下面是比较大一点的 android{} 里面又会存在一些其它闭包,默认配置项 编译的类型,以及一些 依赖的 设置 ,不再详细介绍,dependencies{} 前面说过的 ,都大同小异,但是这里要说几种依赖的方式,

implementation  这种依赖算是谷歌在构建上做的一个 优化,采用这种依赖方式构建,编译期间其它模块是 不会拿到这部分的 依赖的,只有构建 输出以后其它模块才能用到 这里的依赖 ,这样的好处 是会显著减少构建的时间,因为如果更改了依赖 中的内容,只有依赖他的模块会参与重新构建,其它模块并不会,这也是gradle构建中比较推荐的方式,那如果想要其他模块也能引用到该模块引用的三方库,就需要使用api这种引用方式了,compileOnly Gradle 只会将依赖项添加到编译类路径(也就是说,不会将其添加到构建输出)。如果您创建 Android 模块时在编译期间需要相应依赖项,但它在运行时可有可无,此配置会很有用 runtimeOnly Gradle 只会将依赖项添加到构建输出,以便在运行时使用。也就是说,不会将其添加到编译类路径。

      那我们 在来说下gradle wrapper,wrapper会对gradle的版本做一个 包装,适合当前项目,比如我们在当前 项目的 终端执行  gradle 命令 可能不被 识别,那是因为我们没有 配置gradle的全局 环境变量,如果我们 执行 的是  ./gradlew   - xxx  之类的命令 一般都是可以 正常执行的,

此外还有一个这样的文件 

用来配置gradle的路径版本 之类。

Gradle中的细节 

语言:

      我们 知道 gradle的 早期 构建 语言是 Grrovy,后期 加入 了kotlin DSL的支持,Grrovy作为一类动态语言,其实对于我们使用Kotlin的开发者 来说 不会觉得 陌生,里面有很多语言概念 都很相似 ,其实 在 android项目 中编写gradle 相关代码的时候,已经做了更好的封装了 ,对于Groovy的直接使用 概率并不高,简单对Grrovy编程语言做个 了解,也是有些必要的,目前对于Android开发来说,Groovy使用到 最多的地方就是gradle里了。

task:

gradle中想要做一些 额外的操作 ,我们 可以写一些task来实现,对于task这里便不再过多介绍 ,关于 task的文章有很多很多,task的 执行依赖,修改,构建打包之类有很多 介绍。那我们 知道 Gradle有一种增量 构建 的功能 up _to _date, Gradle每次 执行 task都会把task缓存下来,如果 task的入参,或者说 输入没有 变化,那他的输出也不会 有 变化 ,这样我们直接拿缓存里的 task就可以 ,这就避免task重复 执行,节省了构建时间。

生命周期:

gradle中的几个 回调 基本的执行顺序是这样的。

this.gradle.settingsEvaluated {
    //初始化
    println("这是settingsEvaluated")
}
this.gradle.projectsLoaded {
    println("这是 projectsLoaded")
}

this.gradle.beforeProject {
    println("这是beforeProject")
}
this.gradle.afterProject {
    println("这是 afterProject")
}

this.gradle.projectsEvaluated {
    println("这是projectsEvaluated")
}
this.gradle.buildStarted {
    println("这是buildStarted")
}
this.gradle.buildFinished {
    println("这是buildFinished")
}

其他

Gradle如果要 使用的比较好,自然少不了对官方文档 的研读 ,android官网也给出了十分 详细的 文档 ,我们 可以参看 学习。附上链接 

https://developer.android.com/studio/build

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值