美文网首页安卓开发笔记Android RoadAndroid
在AndroidStudio中自定义Gradle插件

在AndroidStudio中自定义Gradle插件

作者: huachao1001 | 来源:发表于2016-07-02 14:16 被阅读5952次

我的CSDN博客同步发布:在AndroidStudio中自定义Gradle插件

转载请注明出处:【huachao1001的简书:http://www.jianshu.com/users/0a7e42698e4b/latest_articles】

一直都想好好学习AndroidStudio中的gradle,总感觉不懂如何在AndroidStudio中自定义gradle插件的程序员就不是个好程序员,这次上网查了一下相关资料,做了一个总结~

1 创建Gradle Module

AndroidStudio中是没有新建类似Gradle Plugin这样的选项的,那我们如何在AndroidStudio中编写Gradle插件,并打包出来呢?

  • (1) 首先,你得新建一个Android Project
  • (2) 然后再新建一个Module,这个Module用于开发Gradle插件,同样,Module里面没有gradle plugin给你选,但是我们只是需要一个“容器”来容纳我们写的插件,因此,你可以随便选择一个Module类型(如Phone&Tablet ModuleAndroid Librarty),因为接下来一步我们是将里面的大部分内容删除,所以选择哪个类型的Module不重要。
  • (3) 将Module里面的内容删除,只保留build.gradle文件和src/main目录。
  • 由于gradle是基于groovy,因此,我们开发的gradle插件相当于一个groovy项目。所以需要在main目录下新建groovy目录
  • (4) groovy又是基于Java,因此,接下来创建groovy的过程跟创建java很类似。在groovy新建包名,如:com.hc.plugin,然后在该包下新建groovy文件,通过new->file->MyPlugin.groovy来新建名为MyPlugingroovy文件。
  • (5) 为了让我们的groovy类申明为gradle的插件,新建的groovy需要实现org.gradle.api.Plugin接口。如下所示:
package  com.hc.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

public class MyPlugin implements Plugin<Project> {

    void apply(Project project) {
        System.out.println("========================");
        System.out.println("hello gradle plugin!");
        System.out.println("========================");
    }
}

因为我本人对groovy也不是特别熟悉,所以我尽可能的用Java语言,使用System.out.println而不是用groovy的pintln "",我们的代码里面啥也没做,就打印信息。

  • (6) 现在,我们已经定义好了自己的gradle插件类,接下来就是告诉gradle,哪一个是我们自定义的插件类,因此,需要在main目录下新建resources目录,然后在resources目录里面再新建META-INF目录,再在META-INF里面新建gradle-plugins目录。最后在gradle-plugins目录里面新建properties文件,注意这个文件的命名,你可以随意取名,但是后面使用这个插件的时候,会用到这个名字。比如,你取名为com.hc.gradle.properties,而在其他build.gradle文件中使用自定义的插件时候则需写成:
apply plugin: 'com.hc.gradle'

然后在com.hc.gradle.properties文件里面指明你自定义的类

implementation-class=com.hc.plugin.MyPlugin

现在,你的目录应该如下:

自定义插件目录结构
  • (7) 因为我们要用到groovy以及后面打包要用到maven,所以在我们自定义的Module下的build.gradle需要添加如下代码:
apply plugin: 'groovy'
apply plugin: 'maven'

dependencies {
    //gradle sdk
    compile gradleApi()
    //groovy sdk
    compile localGroovy()
}

repositories {
    mavenCentral()
}

2 打包到本地Maven

前面我们已经自定义好了插件,接下来就是要打包到Maven库里面去了,你可以选择打包到本地,或者是远程服务器中。在我们自定义Module目录下的build.gradle添加如下代码:

//group和version在后面使用自定义插件的时候会用到
group='com.hc.plugin'
version='1.0.0'

uploadArchives {
    repositories {
        mavenDeployer {
            //提交到远程服务器:
           // repository(url: "http://www.xxx.com/repos") {
            //    authentication(userName: "admin", password: "admin")
           // }
           //本地的Maven地址设置为D:/repos
            repository(url: uri('D:/repos'))
        }
    }
}

其中,groupversion后面会用到,我们后面再讲。虽然我们已经定义好了打包地址以及打包相关配置,但是还需要我们让这个打包task执行。点击AndroidStudio右侧的gradle工具,如下图所示:

上传Task

可以看到有uploadArchives这个Task,双击uploadArchives就会执行打包上传啦!执行完成后,去我们的Maven本地仓库查看一下:

打包上传后

其中,com/hc/plugin这几层目录是由我们的group指定,myplugin是模块的名称,1.0.0是版本号(version指定)。

3 使用自定义的插件

接下来就是使用自定义的插件了,一般就是在app这个模块中使用自定义插件,因此在app这个Module的build.gradle文件中,需要指定本地Maven地址、自定义插件的名称以及依赖包名。简而言之,就是在app这个Module的build.gradle文件中后面附加如下代码:

buildscript {
    repositories {
        maven {//本地Maven仓库地址
            url uri('D:/repos')
        }
    }
    dependencies {
        //格式为-->group:module:version
        classpath 'com.hc.plugin:myplugin:1.0.0'
    }
}
//com.hc.gradle为resources/META-INF/gradle-plugins
//下的properties文件名称
apply plugin: 'com.hc.gradle'

好啦,接下来就是看看效果啦!先clean project(很重要!),然后再make project.从messages窗口打印如下信息:

使用自定义插件

好啦,现在终于运行了自定义的gradle插件啦!

4 开发只针对当前项目的Gradle插件

前面我们讲了如何自定义gradle插件并且打包出去,可能步骤比较多。有时候,你可能并不需要打包出去,只是在这一个项目中使用而已,那么你无需打包这个过程。

只是针对当前项目开发的Gradle插件相对较简单。步骤之前所提到的很类似,只是有几点需要注意:

  1. 新建的Module名称必须为BuildSrc
  2. 无需resources目录

目录结构如下所示:

针对当前项目的gradle插件目录

其中,build.gradle内容为:

apply plugin: 'groovy'

dependencies {
    compile gradleApi()//gradle sdk
    compile localGroovy()//groovy sdk
}

repositories {
    jcenter()
}

SecondPlugin.groovy内容为:

package  com.hc.second

import org.gradle.api.Plugin
import org.gradle.api.Project

public class SecondPlugin implements Plugin<Project> {

    void apply(Project project) {
        System.out.println("========================");
        System.out.println("这是第二个插件!");
        System.out.println("========================");
    }
}

app这个Module中如何使用呢?直接在app的build.gradle下加入

apply plugin: com.hc.second.SecondPlugin

clean一下,再make projectmessages窗口信息如下:

打印信息

由于之前我们自定义的插件我没有在appbuild.gradle中删除,所以hello gradle plugin这条信息还会打印.

参考资料:http://kvh.io/cn/tags/EmbraceAndroidStudio/

献上源码:http://download.csdn.net/detail/huachao1001/9565654

相关文章

网友评论

  • g小志:有问题作者能否简单回复下:

    为什么我按你的方法建立针对当前项目的gradle插件老是报找不到插件错误,下载你的源码报同样的错误,在线等。
    luckySe7en:翻墙 应该就能解决该问题吧
  • 11amok:有个错误,
    buildscript {
    repositories {
    maven {//本地Maven仓库地址
    url uri('D:/repos')
    }
    }
    dependencies {
    //格式为-->group:module:version
    classpath 'com.hc.plugin:myplugin:1.0.0'
    }
    }
    //com.hc.gradle为resources/META-INF/gradle-plugins
    //下的properties文件名称
    apply plugin: 'com.hc.gradle'

    这一串应该加到项目根目录的build.gradle里
    qugengting:并不需要啊
  • xbase:而且这样生成的插件,因为没有生成plugin.xml文件,在使用Preferences--->Plugins--->Install plugin from disk...功能时会报错Fail to load plugin descriptor from file XXX.jar
  • xbase:需要把apply plugin:'com.xf.gradle'方法app下面的build.gradle里,而maven {
    url uri('D:/repos')
    }和 classpath 'com.hc.plugin:myplugin:1.0.0' 放到project下面的build.gradle文件里,才能生效,否则报com.hc.gradle not found
  • 肥哥竹竿:第一种方法成功了,第二种出问题了
    qugengting:@andev009 正解
    andev009:resources目录还是需要的,加了resources标识插件id就跑起来了
  • 青空碧宇:楼主,很多人按照你的代码遇到了找不到插件的问题,能否有空了解答一下呢?
    HoooChan:@虾米_b619 到电脑系统里的文件管理器里面直接修改后缀名就行了
    81b2a8b863d6:请问您解决了吗,我现在也是报这个错。
    HoooChan:Android Studio中会把文件的后缀名隐藏起来,会导致编译出错或找不到自定义的插件,所以要手动补上去。尤其是properties文件和groovy文件。
  • Mtlun:为什么我按你的方法建立针对当前项目的gradle插件老是报找不到插件错误,下载你的源码报同样的错误,在线等。
    81b2a8b863d6:请问您解决了吗,也遇到这个问题了
    81b2a8b863d6:@HoooChan 请问手动补上去是怎么操作的?在线等,谢谢。
    HoooChan:Android Studio中会把文件的后缀名隐藏起来,会导致编译出错或找不到自定义的插件,所以要手动补上去。尤其是properties文件和groovy文件。
  • 674fa1c36ad3:apply plugin: com.hc.second.SecondPlugin 这个使用方式 我的ubantu下面的as不识别 但是mac下的代码是好用的 知道原因吗
    674fa1c36ad3:@廷皓 * What went wrong:
    A problem occurred evaluating script.
    > Could not get unknown property 'com' for project ':plugin' of type org.gradle.api.Project.

  • 1dbc2cca3ff9:怎么在编译过程插入一个task呢,比如在resource merge 后做点儿什么,关于gradle 编译过程相关的一些task,楼主有资料么
  • 蟋蟀哥:具体有什么用途呢?
    huachao1001: @蟋蟀哥 用途很多,等看后续得文章你就能感受得到

本文标题:在AndroidStudio中自定义Gradle插件

本文链接:https://www.haomeiwen.com/subject/lkyqjttx.html