为Android Studio编写自定义Gradle插件的教程

Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译、打包的,那么问题来了,gradle可是有一堆东西...,为了彻底了解gradle,今天就来学习下如何写自己的gradle插件(当然插件源码是使用groovy写的),先看如下代码目录:

如上图所示,plugin目录是插件源码目录,sample是用来测试插件的。

1、在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类MyCustomPlugin.groovy

package com.micky.gradle; 

import org.gradle.api.*; 

class MyCustomPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.task('myTask') << {
      println "Hi this is micky's plugin"
    }
  }
}

看看Plugin的源码,其实就是一接口

public interface Plugin<T> {
  /**
   * Apply this plugin to the given target object.
   *
   * @param target The target object
   */
  void apply(T target);
}

2、在目录plugin/src/main/resources/META-INF/gradle-plugins/下创建文件com.micky.mycustom.properties用来指定插件实现类

implementation-class=com.micky.gradle.MyCustomPlugin

特别注意下:文件名“com.micky.mycustom”即是以后我们在使用插件时的apply plugin 'java' 的java,这里我也是折腾了半天才得出的结果,坑啊。

3、一般情况下,我们还需要指定插件项目名称,在plugin目录下新建settings.gradle

rootProject.name='gradle-micky'

4、万事具备,就差编译了,编译需要在plugin目录下新建build.gradle

apply plugin: 'groovy'
apply plugin: 'maven' 

dependencies {
  compile gradleApi()
  compile localGroovy()
} 

repositories {
  mavenCentral()
} 

group='com.micky'
version='1.0.0' 

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: uri('../repo'))
    }
  }
}

在这个脚本里使用groovy插件编译groovy源码,声明gradleAPI作为即时编译依赖,apply plugin: 'maven' 是用来创建一个插件jar文件并且存储在本地maven库里,本地maven库即我们在脚本里创建的"../repo"目录
执行命令:

gradle uploadArchives

5、以上4个步骤已经编译插件并上传到了本地库中,接下来就看看怎么使用插件,在sample目录下,新建build.gradle

buildscript {
  repositories {
    maven {
      url uri('../repo')
    }
  } 

  dependencies {
    classpath group: 'com.micky',
      name: 'gradle-micky',
      version: '1.0.0'
  }
} 

apply plugin: 'com.micky.mycustom'

6、执行命令

myTask即我们在MyCustomPlugin.groovy代码中创建的任务。

7、自定义Task

(1)copy一份改名CustomPluginTask

在plugin\src\main\groovy\com\micky\gradle目录创建源文件 MyCustomTask.groovy

package com.micky.gradle; 

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction 

class MyCustomTask extends DefaultTask {
  @TaskAction
  void output() {
    println "Hello this is my custom task output"
  }
}

(2)修改MyCustomPlugin.groovy

package com.micky.gradle; 

import org.gradle.api.*; 

class MyCustomPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.task('customTask', type: MyCustomTask)
  }
}

(3)修改plugin目录下的build.gradle,修改版本号

apply plugin: 'groovy'
apply plugin: 'maven' 

dependencies {
  compile gradleApi()
  compile localGroovy()
} 

repositories {
  mavenCentral()
} 

group='com.micky'
version='1.0.1' 

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: uri('../repo'))
    }
  }
}

执行gradle uploadArchives 编译插件包
        
(4)sample目录下的build.gradle

buildscript {
  repositories {
    maven {
      url uri('../repo')
    }
  } 

  dependencies {
    classpath group: 'com.micky',
      name: 'gradle-micky',
      version: '1.0.1'
  }
}
apply plugin: 'com.micky.mycustom' 

执行gradle customTask 结果如下:

8、向Plugin Task 传递参数
(1)拷贝一份上面的代码,改名为CustomPluginTaskWithParam,修改plugin\src\main\groovy\com\micky\gradle\MyCustomPlugin.groovy

package com.micky.gradle; 

import org.gradle.api.*; 

class MyCustomPluginExtension {
  def message = "From MyCustomPluginExtention"
  def sender = "MyCustomPluin"
} 

class MyCustomPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.extensions.create('myArgs', MyCustomPluginExtension)
    project.task('customTask', type: MyCustomTask)
  }
}

(2)修改plugin\src\main\groovy\com\micky\gradle\MyCustomTask.groovy

package com.micky.gradle; 

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction 

class MyCustomTask extends DefaultTask {
  @TaskAction
  void output() {
    println "Sender is ${project.myArgs.sender},\nmessage: ${project.myArgs.message}"
  }
}

(3)修改plugin/build.gradle

apply plugin: 'groovy'
apply plugin: 'maven' 

dependencies {
  compile gradleApi()
  compile localGroovy()
} 

repositories {
  mavenCentral()
} 

group='com.micky'
version='1.0.2' 

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: uri('../repo'))
    }
  }
}

执行gradle uploadArchives 编译插件包

(4)修改sample/build.gradle

buildscript {
  repositories {
    maven {
      url uri('../repo')
    }
  } 

  dependencies {
    classpath group: 'com.micky',
      name: 'gradle-micky',
      version: '1.0.2'
  }
} 

apply plugin: 'com.micky.mycustom'

(5)执行gradle customTask,结果如下:

(6)在gradle文件配置参数

buildscript {
  repositories {
    maven {
      url uri('../repo')
    }
  } 

  dependencies {
    classpath group: 'com.micky',
      name: 'gradle-micky',
      version: '1.0.2'
  }
} 

apply plugin: 'com.micky.mycustom' 

myArgs {
  sender='Micky Liu'
  message='Gradle is so simple.'
}

(7)执行gradle customTask,结果如下:

8、向Plugin Task 传递嵌套试复杂参数
(1)拷贝一份上面的代码,改名为CustomPluginTaskWithNestParam,修改plugin\src\main\groovy\com\micky\gradle\MyCustomPlugin.groovy

package com.micky.gradle; 

import org.gradle.api.*; 

class MyNestPluginExtension {
  def receiver = "Kate Zhou"
  def email = "KateZhou@gmail.com"
} 

class MyCustomPluginExtension {
  def message = "From MyCustomPluginExtention"
  def sender = "MyCustomPluin"
} 

class MyCustomPlugin implements Plugin<Project> {
  void apply(Project project) {
    project.extensions.create('myArgs', MyCustomPluginExtension)
    project.myArgs.extensions.create('nestArgs', MyNestPluginExtension)
    project.task('customTask', type: MyCustomTask)
  }
}

(2)修改MyCustomPlugin.groovy

package com.micky.gradle; 

import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction 

class MyCustomTask extends DefaultTask {
  @TaskAction
  void output() {
    println "Sender is ${project.myArgs.sender} \nmessage: ${project.myArgs.message}"
    println "Receiver is ${project.myArgs.nestArgs.receiver} \nemail: ${project.myArgs.nestArgs.email}"
  }
} 

(3)修改plugin/build.gradle

apply plugin: 'groovy'
apply plugin: 'maven' 

dependencies {
  compile gradleApi()
  compile localGroovy()
} 

repositories {
  mavenCentral()
} 

group='com.micky'
version='1.0.3' 

uploadArchives {
  repositories {
    mavenDeployer {
      repository(url: uri('../repo'))
    }
  }
}

(4)执行gradle uploadArchives 编译插件包
(5)修改sample/build.gradle

buildscript {
  repositories {
    maven {
      url uri('../repo')
    }
  } 

  dependencies {
    classpath group: 'com.micky',
      name: 'gradle-micky',
      version: '1.0.3'
  }
} 

apply plugin: 'com.micky.mycustom' 

myArgs {
  sender='Micky Liu'
  message='Gradle is so simple.'
}

(6)执行执行gradle customTask,结果如下:

(7)在gradle文件配置参数

buildscript {
  repositories {
    maven {
      url uri('../repo')
    }
  } 

  dependencies {
    classpath group: 'com.micky',
      name: 'gradle-micky',
      version: '1.0.3'
  }
} 

apply plugin: 'com.micky.mycustom' 

myArgs {
  sender='Micky Liu'
  message='Gradle is so simple.'
  nestArgs {
    receiver='David Chen'
    email='David@126.com'
  } 

}

(8)执行gradle customTask,结果如下:

源码地址:https://github.com/mickyliu945/GradleCustomPlugin

(0)

相关推荐

  • Android Studio使用教程(六):Gradle多渠道打包

    由于国内Android市场众多渠道,为了统计每个渠道的下载及其它数据统计,就需要我们针对每个渠道单独打包,如果让你打几十个市场的包岂不烦死了,不过有了Gradle,这再也不是事了. 友盟多渠道打包 废话不多说,以友盟统计为例,在AndroidManifest.xml里面会有这么一段: 复制代码 代码如下: <meta-data     android:name="UMENG_CHANNEL"     android:value="Channel_ID" /&g

  • 详解如何使用Android Studio开发Gradle插件

    缘由 首先说明一下为什么会有这篇文章.前段时间,插件化以及热修复的技术很热,Nuwa热修复的工具NuwaGradle,携程动态加载技术DynamicAPK,还有希望做最轻巧的插件化框架的Small.这三个App有一个共同的地方就是大量的使用了Gradle这个强大的构建工具,除了携程的框架外,另外两个都发布了独立的Gradle插件提供自动化构建插件,或者生成热修复的补丁.所以学习一下Gradle插件的编写还是一件十分有意义的事. 插件类型 Gradle的插件一般有这么几种: 一种是直接在项目中的g

  • Android Studio使用教程(五):Gradle命令详解和导入第三方包

    Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看.编译并导入第三方开源项目的方法. Sublime + Terminal编译并查看源码 首先来给大家介绍一种简便并且个人最喜欢的一种办法.很多时候我们在GitHub上看到一个不错的开源项目,一般有两种需求,阅读源码和查看运行效果,如果是单纯的查看源码我更喜欢用一些轻量级编辑器,如vim,sublime等,vim不是很熟练,所以个人一种都习惯用sublime来查看

  • AndroidStudio Gradle基于友盟的多渠道打包方法

    AndroidStudio由于使用了gradle的进行项目构建,使我们开发app方便很多,今天我就给大家列出几点是用gradle的方便之处. 一.AndroidStudio Gradle第三依赖统一管理 二.AndroidStudio Gradle基于友盟的多渠道打包 三.AndroidStudio安全管理签名文件keystroe和签名密码 好久没写博客了,今天写一篇关于多渠道打包的文章. 首先我们要下载友盟的jar包,然后照着文档配置即可.(这里就不过多讲解了,直接看我的代码) 文档地址:ht

  • AndroidStudio Gradle第三依赖统一管理的实现方法

    AndroidStudio由于使用了gradle的进行项目构建,使我们开发app方便很多,今天我就给大家列出几点是用gradle的方便之处. 一.AndroidStudio Gradle第三依赖统一管理 二.AndroidStudio Gradle基于友盟的多渠道打包 三.AndroidStudio安全管理签名文件keystroe和签名密码 这三篇文章很好的讲解了gradle的在打包和项目依赖管理的优点,大家可以参考一下,来提高自己的开发效率,增强签名文件的安全性. 在很多时候我们使用Andro

  • Android Studio使用教程(四):Gradle基础

    其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了很多,所以暂且结合Stduio 1.0正式版与最新的Gradle语法来详细讲解下,小伙伴们直接跟我一步步来学习吧. 什么是Gradle? Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言. 安装Gradle 在Android Studio系列教程一–下载与安装中新建项目成功后会下载Grad

  • 为Android Studio编写自定义Gradle插件的教程

    Google已经建议Android开发全部转向Android Studio开发,Android Studio 是使用gradle编译.打包的,那么问题来了,gradle可是有一堆东西...,为了彻底了解gradle,今天就来学习下如何写自己的gradle插件(当然插件源码是使用groovy写的),先看如下代码目录: 如上图所示,plugin目录是插件源码目录,sample是用来测试插件的. 1.在目录plugin/src/main/groovy/com/micky/gradle/下新建插件类My

  • Android自定义Gradle插件的详细过程

    一.Gradle 我们知道在我们现在使用Android Stduio开发Android项目的时候,Android Studio是基于Gradle来帮助我们构建,管理项目的. Gradle:Gradle是一个项目构建工具,用来帮助我们管理项目的依赖.打包.发布.部署等工作. Gradle是通过如build.gradle这种gradle脚本来进行项目构建的,所以我们对项目的构建配置都是可以写在gradle构建脚本中. gradle构建脚本使用的是Groovy语言,Groovy语言也是一种jvm语言,

  • Android Studio手动配置Gradle的方法

    Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置. 面向Java应用为主.当前其支持的语言限于Java.Groovy和Scala,计划未来将支持更多的语言. 下面是一些Gradle的功能 按约定声明构建和建设: 强大的支持多工程的构建: 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程: 全力支持已有的 Maven 或者Ivy仓库基础建

  • Android Studio 生成自定义jar包的步骤详解

    想要将一个项目导出为jar包,供其它项目使用,在eclipse中可以直接导出该项目为jar包,而 在AS中可以通过修改gradle才处理. 接下来就介绍下具体的步骤: 1.新建一个项目,项目名随意,eg:MakeJarApplication,在项目中新建一个module类型为android-library ,命名为testLibrary.如图: 项目结构图 2.让app依赖这个库,在app下的build.gradle文件中添加compile project(':testlibrary') dep

  • 使用Android studio编写一个小的jni程序

     1.简单介绍一下NDK和JNI NDK:NDK是Native Development Kit的缩写,是Google提供的一套工具集,可以让你其他语言(C.C++或汇编)开发 Android的 JNI.NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so库. JNI:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 2.打开Android

  • Android Studio 3.0 Gradle 配置变更

    多渠道打包变更 flavorDimensions "default" productFlavors { xxxx { dimension "default" } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] } 更改打包命名及路径 android.applicationVariants.all { variant -> if (va

  • android studio 3.0 gradle 打包脚本配置详解

    本文介绍了android studio 3.0 gradle 打包脚本配置,分享给大家,具体如下: 修改输出的名字 保存输出的文件路径 def fileArray = [] //遍历输出文件 android.applicationVariants.all { variant -> variant.outputs.all { output -> def outputFile = output.outputFile if (outputFile != null && outputF

  • Android Studio 3.0 gradle提示版本太老

    很多朋友在用Android Studio 3.0 gradle提示一下内容: The android gradle plugin version 3.0.0-alpha1 is too old, please update to the latest version. To override this check from the command line please set the ANDROID_DAILY_OVERRIDE environment variable to "d27b293

  • android studio 安装完成ButterKnife插件却无法使用(解决方案)

    ButterKnife 算是一款知名老牌 Android 开发框架了,通过注解绑定视图,避免了 findViewById() 的操作,广受好评!由于它是在编译时对注解进行解析完成相关代码的生成,所以在项目编译时会略耗时,但不会影响运行时的性能. 很多朋友在android studio 安装完成ButterKnife插件后,却无法使用.今天小编把我的解决方法分享出来供大家参考下. 1.在设置里找到插件正常安装好 2.选择activity_main右键Generate菜单中没有相应的插件选项 3.我

  • Android Studio 配置:自定义头部代码注释及添加模版方式

    1. 自定义头文件注释: 实现效果 实现步骤 依次操作File -> Settings ->Editor ->File and Code Templates,在详细展示窗口点击includes选项卡,找到 FileHeader点击,在编辑窗口输入自定义的注释模板即可.如下图: 注:我们这里添加的头文件不会随着Activity的创建自动添加头文件,只有创建JavaBean时会自动添加头文件,如下图所示: 2. 如何给Activity添加头文件?? 依次操作File -> Settin

随机推荐