Gradle 本身提供了一些基本的概念和整体核心的框架,其他用于描述真实使用场景的都可以通过插件扩展的方式来实现。这样就可以通过抽象的方式提供一个核心的框架,其他具体的功能和业务都通过插件扩展的方式来实现。

Gradle 内置了很多常用的插件,基本满足大部分工作,但是也有一些插件是没有内置的,这时候就需要我们扩展现有插件或者自定义插件来达到我们的目的。比如 Android Gradle 插件就是基于内置的Java插件实现的。

一、插件的作用

插件会扩展项目的功能,帮助我们在项目的构建的过程中做很多事情:

  • 可以添加任务到项目中,帮助完成诸如 测试、编译、打包等事情。
  • 可以添加依赖配置到项目中,通过它们来配置我们在构建过程中的依赖。
  • 可以向项目中现有的对象类型添加新的扩展属性、方法等,可以使用它们来配置优化构建。例如:android{}这个配置块就是Android Gradle插件为Project对象添加的一个扩展。
  • 可以对项目进行一些约定,比如应用Java插件后,可以约定src/main/java目录下是我们的源代码的存放地址,在编译的时候也是编译这个目录下的Java源代码文件。

这就是插件,我们只需要按照它约定的方式,使用它提供的任务、方法或者扩展,就可以对我们的项目进行构建。

二、如何应用插件

插件的应用都是通过Project.apply()方法完成的。apply有好几种用法,并且插件也分为二进制插件和脚本插件。下面我们分别介绍一下:

1. 应用二进制插件

二进制插件就是实现了org.gradle.api.Plugin接口的插件,它们可以有plugin id。

举例:下面我们看一下如何应用一个Java插件:

apply plugin:'java'

使用上面的语句就可以把java插件应用到我们的项目中了,其中‘java’就是Java插件的plugin id,它是唯一的。

2. 应用脚本插件

脚本插件的使用方式如下例所示:

build.gradle:

apply from:'version.gradle'

task outVersion {

    println("APP版本是:${versionName},版本号是:${versionCode}")

}

version.gradle:

ext {
versionName = '1.3.0'
versionCode = 1
}

允许结果如下:

renhui$ gradle outVersion

> Configure project :
APP版本是:1.3.0,版本号是:1 BUILD SUCCESSFUL in 0s

应用脚本插件,其实就是把脚本加载进来,和二进制插件不同的是它使用的是from关键字,后面紧跟着一个脚本文件(可以是本地文件,也可以是网络文件)。

脚本插件能帮助我们把较大较复杂的脚本文件进行分块、分段整理,它是脚本文件模块化的基础。

3. 应用第三方发布的插件

第三方发布的作为jar的二进制插件,我们在应用的时候,必须要在buildscript{}里面配置其classpath才能使用,这个不像Gradle为我们内置的插件。

比如我们的Android Gradle插件就属于Android发布的第三方插件,如果我们要使用它就要先配置,示例如下:

buildscript {
repositories {
google()
jcenter() }
dependencies {
classpath 'com.android.tools.build:gradle:3.4.0'
}
}

buildscript{}块是一个在构建项目之前,为项目进行前期准备和初始化相关配置依赖的地方,配置好所需的依赖,就可以应用其提供的插件了。

下面是在app层应用android gradle插件的方式:

apply plugin: 'com.android.application'

如果没有提前在buildscript里配置依赖的classpath,则会报错,提示找不到这个插件。

三、Java Gradle 插件

使用Java Gradle插件我们能够很轻松的构建出一个项目,我们常用的方式就是使用简称应用Java Gradle插件:

apply plugin: 'java'

通过以上的配置,Java插件会为工程添加很多有用的默认设置和约定,比如源代码的位置,单元测试代码的位置、资源文件的位置等。

作为Java项目,我们不可避免的会依赖很多第三方的Jar,这也是值得提倡的,因为有很多开源的工具和框架能够帮助我们更加高效的开发。下面我们就讲一下如何配置第三方依赖。

1. 配置第三方依赖

想要使用这些第三方依赖,就需要告诉Gradle如何找到这些依赖,也就是我们要讲的依赖配置。

一般情况下我们都是从仓库中查找我们需要的Jar包,在Gradle中要配置一个仓库的Jar依赖,首先我们得告诉Gradle我们要是有什么类型的仓库,这些仓库的位置在哪里,这样Gradle就知道从哪里去搜寻我们依赖的Jar,例如:

respositories {
mavenCentral()
}

以上代码,我们配置了一个Maven中心库,告诉Gradle可以在Maven中心库中搜寻我们依赖的Jar,除此之外,我们也可以从jcenter库、ivy库、本地Maven库mavenLocal等中搜寻。由此可见,Gradle支持的仓库非常丰富,也可以多个仓库一起使用。比如一些公共的开源框架可以从mavenCenteral上下载,一些我们公司私有的Jar可以在自己搭建的Maven私服上下载:

respositories {
mavenCentral()
maven {
url 'http://www.mavenurl.com'
}
}

有了仓库,我们就可以通过配置告诉Gradle,我们需要依赖什么,例如:

dependencies {
compile group: 'com.squareup.okhttp3', name: 'okhttp', version: '3.0.1'
}

在上面的例子中,我们配置了一个okhttp的依赖,其中compile是依赖名称,它的意思表示我们在编译Java源文件时需要依赖okttp,并提供了GAV信息。

但是相对来说,上面的写法还是稍显麻烦的,Gradle为我们提供了简写的方式:

dependencies {
compile 'com.squareup.okhttp3:okhttp:3.0.1'
}

2. 配置项目&文件依赖

除了我们在上面提到的仓库的三方依赖,我们还可以进行项目的依赖以及文件的依赖。

项目依赖示例:

dependencies {
compile project(':example')
}

依赖后,此项目中的Java等类就可以进行使用了,就像使用自己项目中的类一样。

文件依赖,一般是依赖一个jar包(出于某些原因,不能将jar发布到Maven中心库中,只能放在项目中),例如:

dependencies {
compile files('libs/example')
}

通过上面的配置,我们就能成功引入这两个Jar包了。

但有时候,libs文件里的类太多了,不能一个个写,这时候我们就可以通过以下的方式配置:

dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}

这样配置后,libs下的文件夹的扩展名为jar的都会被依赖,非常方便。

Android Gradle 学习笔记(六):Gradle 插件的更多相关文章

  1. [转]Android Studio系列教程六--Gradle多渠道打包

    转自:http://www.stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/ Android Studio系列教程六--Grad ...

  2. Android Studio系列教程六--Gradle多渠道打包

    Android Studio系列教程六--Gradle多渠道打包 2015 年 01 月 15 日 DevTools 本文为个人原创,欢迎转载,但请务必在明显位置注明出处!http://stormzh ...

  3. Android:日常学习笔记(2)——分析第一个Android应用程序

    Android:日常学习笔记(2)——分析第一个Android应用程序 Android项目结构 整体目录结构分析 说明: 除了APP目录外,其他目录都是自动生成的.APP目录的下的内容才是我们的工作重 ...

  4. Android Studio 学习笔记(一)环境搭建、文件目录等相关说明

    Android Studio 学习笔记(一)环境搭建.文件目录等相关说明 引入 对APP开发而言,Android和iOS是两大主流开发平台,其中区别在于 Android用java语言,用Android ...

  5. Android自动化学习笔记之MonkeyRunner:官方介绍和简单实例

    ---------------------------------------------------------------------------------------------------- ...

  6. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)———探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  7. Android自动化学习笔记:编写MonkeyRunner脚本的几种方式

    ---------------------------------------------------------------------------------------------------- ...

  8. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  9. android开发学习笔记000

    使用书籍:<疯狂android讲义>——李刚著,2011年7月出版 虽然现在已2014,可我挑来跳去,还是以这本书开始我的android之旅吧. “疯狂源自梦想,技术成就辉煌.” 让我这个 ...

  10. Android Animation学习(六) View Animation介绍

    Android Animation学习(六) View Animation介绍 View Animation View animation系统可以用来执行View上的Tween animation和F ...

随机推荐

  1. HihoCoder 1636

    /** * 题目链接:https://cn.vjudge.net/problem/HihoCoder-1636 * 题目意思,石子合并,每次可以合并相邻的石子.每次可以x堆合并为一堆. * x属于[l ...

  2. Android多点触控技术

    1 简介 Android多点触控在本质上需要LCD驱动和程序本身设计上支持,目前市面上HTC.Motorola和Samsung等知名厂商只要使用电容屏触控原理的手机均可以支持多点触控Multitouc ...

  3. LeetCode Majority Element I

    原题链接在这里:https://leetcode.com/problems/majority-element/ 题目: Given an array of size n, find the major ...

  4. bzoj 1398: 寻找主人 AC自动机+最小表示法

    题目大意: 给定两个序列判断是否循环同构,若循环同构则输出最小表示 题解: 因为没有样例输入输出,一开始没看到要求输出最小表示 Wa一大页. 但不得不说bzoj还是挺高效的: 赞一个 XD.jpg 判 ...

  5. pytorch 调用forward 的具体流程

    forward方法的具体流程: 以一个Module为例:1. 调用module的call方法2. module的call里面调用module的forward方法3. forward里面如果碰到Modu ...

  6. UITextField常见用法

    //实例变量和全局变量的区别 //1.定义位置有区别:全局变量定义在方法的外部,实例变量写在接口文件或者延展中的大括号之内 //2.生命周期:全局变量生命周期和应用程序生命周期相同,实例变量的生命周期 ...

  7. css3 tranform perspective属性

    perspective 属性用于规定观察点距离元素的距离, 1 观察点距离元素越近,元素变形就越大,灭点距离越近. 2 观察点距离元素越远,元素变形越小,灭点距离也就越远. 比如设置perspecti ...

  8. Java常见设计模式之单例模式

         1.何为单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的 ...

  9. cocos2d-x 屏幕分辨率适配方法

    转自:http://blog.csdn.net/somestill/article/details/9950403 bool AppDelegate::applicationDidFinishLaun ...

  10. 【总结整理】JQuery基础学习---样式篇

    进入官方网站获取最新的版本 http://jquery.com/download/    中文 https://www.jquery123.com/ <!--JQuery:轻量级的JavaScr ...