一篇文章看懂gradle

这段时间来学习了gradle,也体会到了gradle从初步理解到基本熟悉,再到深入源码这样一个过程中的一些曲折。于是就萌发了写这样一篇逐步深入原理的文章的想法。

这篇文章主要是gradle的基础知识篇。看完这篇文章,你可以:

  • 清楚gradle的定义和解决的痛点
  • 基本理解Android gradle的运作机制
  • 基本理解gradle的大部分语法
  • 学会基本的groovy开发

如果你想关注gradle更深入的一些知识,请继续关注后续gradle文章。

what is gradle?

先来看一段维基百科上对于gradle的解释。

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML。当前其支持的语言限于Java、Groovy和Scala,计划未来将支持更多的语言。

可能刚接触gradle的同学都不是很了解gradle的这个定义。可能就只会跟着网上的教程copy一点配置,但是不理解这些配置背后的原理。那么怎么来理解这句话呢,我们可以把握到三个要点:首先,它是一种构建工具,其次,gradle是基于maven概念的,最后,使用groovy这种语言来声明。要理解这几句话,我们先考虑几个场景。

1.渠道管理:国内手机市场有大大小小数十个,大的手机厂商也有五六个,每个厂商可能又有不同的定制rom。如果我们要为不同市场和厂商进行适配,那就需要写这样的代码

if(isHuawei) {
    // dosomething
} else if(isOppo) {
    // dosomething
}

这样的话,繁琐不说,对单个手机而言大量的无用代码被编译进apk中,包体积和运行速度都会受影响。为了解决这个问题,gradle引进了productFlavor和buildType的能力,能根据情况来进行打包。所以说他是一个自动化构建工具。可以看官方文档

2.依赖管理:我们通常会在项目中引入各种三方库进行代码复用。比如,直接手动把jar或者aar copy到项目中,然后添加依赖。这种方法缺陷很明显,首先配置和删除流程很繁琐,其次,同一个jar可能会被多个项目所引用,导致不知不觉就copy了多个jar。最后,版本管理艰难。为了解决这个问题,gradle是基于maven仓库,配置和删除的时候仅需要对仓库的坐标进行操作,所有的库都会被gradle统一管理,大多数情况下每个库只会有一个版本存在于项目中,并且每个库只会有一个副本存在于项目中。

所以gradle其实不是什么神秘的东西,只是基于某种语言(groovy, java, kotlin)的一种构建工具而已。只要我们大概掌握了基本的用法和他的内部原理,日常工作中就会知道自己网上搜到的命令是什么意思啦。skr~

小试牛刀-android中的gradle

咱们先看看日常工作中经常用到的几个gradle文件。可以看到主要有有三个文件:
1.build.gradle
根文件下放的通常放的是针对整个工程的通用配置,每个module下面的build.gradle文件是针对每个module自身的配置。

buildscript {
    ext.kotlin_version = '1.2.71'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}
allprojects {
    repositories {
        google()
        jcenter()
    }
}

这是一个默认的配置,我们可以看到有buildscript,allprojects,repositories,dependencies几个配置项,这些配置项是干嘛的呢,很多的同学在刚学gradle的时候都是一脸懵逼的。这些其实是gradle的一种特定的语法,我们称之为DSL(domain-specific language)。可以参考官网。这里可以看到allprojects代理的是每个project,可以理解成我们的每个module,也就是对我们所写的每个module的配置。buildscript主要配置的是打包相关的东西,比如gradle版本,gradle插件版本等,这些都是针对构建工具自己的配置。repositories,dependencies是三方库的仓库和坐标。所以根目录的build.gradle相当于是整体的配置。

而module下的build.gradle主要是android,dependencies等配置项。

apply plugin: 'com.android.application'

android{
    ...
}
dependencies{
    ...
}

可能有些同学会感到奇怪,为啥我们在官网没有看到android这个配置项呢?这个主要是因为它并不是gradle的DSL,某种意义上说应该算是android特有的,是通过Android的插件’com.android.application’带进来的配置项。我们如果把第一行删掉,就会发现android{}这个配置项找不到了。

所以,我们可以发现,build.gradle里面的配置项,要么是gradle自带的,要么是各种插件定义的。有不认识的配置项,就去官网查询一下就好了,授人以鱼不如授人以渔嘛。我们后面也会讲解到引进插件的方式和怎么定义插件和配置项。

2.settings.gradle
这个文件主要是决定每个module是否参与构建。我们可以这样去理解,settings.gradle相当于是每个module的开关,关上了这个module就不能使用了,别的依赖到它的module也都会出问题。

3.gra

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值