自定义gradle插件

通过这个内容,我们能够解释一些在平时android开发中的一些困惑

1.我们每次用到的android域从何而来?

2.为什么在android域内设置一些属性,会在项目中生效
首先,因为用到gradle的大部分都是android开发者,我们来看一个project中的gradle脚本

apply plugin: 'com.android.application'android {    compileSdkVersion 24    buildToolsVersion "23.0.3"    defaultConfig {        applicationId "cn.edu.nuc.gradletest"        minSdkVersion 15        targetSdkVersion 24        versionCode 1        versionName "1.0"        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'    })    compile 'com.android.support:appcompat-v7:24.2.1'    testCompile 'junit:junit:4.12'}

这是一个标准的android项目的gradle脚本,可以看到在刚刚开始,我们引用了一个“com.android.application”插件。那这个插件是如何工作的呢?下面我们从最简单的插件开始,一步一步接近写出一个能够像application这样使用的插件

因为,编写一个插件可以用java,groovy这些应用,但建议还是使用groovy,因为毕竟人家就是用来干这个的。自然支持就好很多。
我们编写一个插件需要考虑这些问题?

  1. 一个类如何才能成为一个插件类
  2. 一个插件类如何能和project进行通信(数据传输)
  3. 一个脚本如何能够灵活使用咱们的插件类

接下来我们就围绕着这些问题进行探讨

如何成为一个插件类

在jvm中如果要实现一个特定功能的类,我们的思路肯定是寻找是否存在一个接口,在文档中我们可以看到,如果我们需要自定义一个插件我们需要实现Plugin这个接口,并实现其apply方法,

for instance:
自定义gradle插件_第1张图片

result:
这里写图片描述

可以看到,我们在脚本中定义的一个插件类,然后顺便就使用了
通过这个最简单的一步,我们可以理解到,一个项目的构建过程,我们可以在插件中全部定义(确定依赖关系),然后一旦一个项目的构建脚本中应用到这个插件就可以获得这个插件中的所有task,然后运行就ok,假如一个项目中有编译,测试,部署3步,我们模拟一下:

自定义gradle插件_第2张图片

这里写图片描述

ok,我们可以看到,一个基本项目的构建就这样模拟出来了,实际情况下,我们将这些task里面填写一些逻辑就可以完成一个真实项目的插件了

插件和脚本(project)通信

如果是android开发者,大家都都知道在build,gradle中有一个android域,在这里面对android进行各种配置,因为android project的构建是由”com.android.application”这个插件进行的,使用这些配置也必须传入到这个插件中,那一个build脚本是如何将配置信息传入一个插件中的呢?

一般我们的做法都是使用一个Extension(拓展类)来存储信息并通信的

for instance:
自定义gradle插件_第3张图片

result:
这里写图片描述

可以看到,我们通过创建一个拓展类的变量去传递信息.插件中打印出字符串是脚本中我们自己去设置的,这就极大的增加了一个插件的灵活性。

可能大家感觉这个和我们构建android的脚本有些不一样,所以我们就来模拟一个类似android项目的插件

自定义gradle插件_第4张图片

这里写图片描述

如何,是不是感觉gradle不再神秘,一个android插件也就那么回事
我们一直都是在脚本中直接定义插件,这种做法非常不灵活,使我们的插件不能很多的应用到多个项目中,接下来就让我们继续探索,如何插件一个灵活的插件

如建立一个插件项目

首先我们需要建立一个项目的目录
项目的结构如下:

自定义gradle插件_第5张图片
这里需要注意一点就行,resources里面的那个配置文件的,文件名就是你这个插件的id(唯一标识符),我们之后 apply plugin: ‘XXX’就需要这个ID

建立好这个目录后,我们开始码代码了,可以看到这里面有四个文件需要我们写
1.插件类
自定义gradle插件_第6张图片
2.将ID和插件类对应
这里写图片描述
3.这个项目的初始化
这里写图片描述
4.项目的构建
自定义gradle插件_第7张图片
可以看到主要的工作还是在build.gradle中实现的

1.引用了2个插件 ‘groovy’和’maven’

2.然后定义了编译时候的依赖

compile gradleApi()compile localGroovy()

3.指定了group和version唯一确定这个插件

4.指定仓库以及上传仓库的路径

ok,这样一个插件就搞定了,然后我们运行什么任务呢
如果不清楚的话,可以使用

gradle tasks查看

查看之后应该是执行 Upload task

执行 gradle task 发现

自定义gradle插件_第8张图片
在这个项目的同级目录下多出一个目录文件,里面包含着我们的一些jar和pom

然后我们就可以开始进行应用这个插件了,我们在同级目录下创建一个项目

然后coding build.gradle
自定义gradle插件_第9张图片

在这里我们主要是指定了仓库和插件的项目,然后apply了这个插件

这里说下指定项目时应该是 Group:projectName:Version的格式

我们运行一下这个项目

可以看到我们已经成功应用插件了

android插件是怎样的?

最后我们可以看下android的插件是怎么样的?

首先我们可以看到id和插件类的对应关系

自定义gradle插件_第10张图片
然后我们看下插件类的结构,大体就是分为插件类和拓展类,然后都有一个base类
自定义gradle插件_第11张图片

最后看下我们的android域是如何创建的,和我们前面的插件方法是一样的
这里写图片描述
ok.相信到这里大家对自定义gradle插件以及android中的gradle脚本应该非常清楚

更多相关文章

  1. 通过 Android SDK Manager 安装面向 Android* 模拟器插件的英特
  2. -如何将Eclipse中的项目迁移到Android Studio 中
  3. android studio 1.5.1 创建java项目
  4. android 下编译c++项目
  5. 演化理解 Android 异步加载图片
  6. Android布局的一些属性和开关、创建log图片
  7. 如何将Eclipse中的项目迁移到Android Studio 中
  8. Android WebView实现选择本地图片拍照功能
  9. MPAndroidChart项目实战(六)——自定义1MPAndroidChart滑动冲突解

随机推荐

  1. Android之在应用程序内部关注某人的微信
  2. android Retrofit 2.0
  3. Android使用Ant自动编译签名打包详解
  4. Android(安卓)传感器介绍
  5. Android中Bitmap, Drawable, Byte之间的
  6. Android(安卓)TextView(EditView)文字底部
  7. android shape和selector
  8. Android(安卓)Tool Chain Creater
  9. CoordinatorLayout+AppBarLayout 底部无
  10. Android(安卓)中 Movie 类显示GIF图片