用IntelliJ实现android gradle插件

用IntelliJ实现android gradle插件

android的gradle插件用了不少了,比如说官方的应用构建插件(com.android.application),lib构建插件(com.android.library),还有第三方的比如辅助multidex的DexKnifePlugin。但是怎么自己创建一个gradle插件一直不明白,今天就试一试自己撸一个android gradle插件,毕竟实践出真知。

基础知识

首先得知道一个gradle插件有需要哪些元素。

我们以android的application插件为例,往往有如下代码,这些代码到底是什么?

//root build.gradle
    dependencies {
        classpath ‘com.android.tools.build:gradle:2.2.3‘
    }
//app build.gradle
apply plugin: ‘com.android.application‘
属性 备注
pluginId com.android.application 对应一个Plugin类
groupId com.android.tools.build
artifactId gradle
version 2.2.3

以上是一个gradle插件必须的属性。然后既然是gradle 插件必须实现Plugin<Project>接口。groupId、artifactId、version指定了一个插件工程,每个插件工程下可以有若干个插件(每个插件一个pluginId)

创建gradle插件

首先选择科学工具IntelliJ,之前在groovy入门指南1里面已经配置好了groovy和IntelliJ的环境,所以可以直接搞起来。

  • 1、打开IJ(IntelliJ),new->gradle->选上java和groovy->Next,如下图所示

  • 2、选择groupId和artifactId以及版本。这3个是就是我们说的gradle插件四属性的3个,他们可以确定classpath

这里我们配置如下,注意版本号写1.0

  • 3、勾上use auto-import和 create directories for empty..,这样会帮我们自动导包并创建好groovy和java根目录

  • 4、just next
  • 5、第一次创建gradle工程,他会去下载2个jar,junit:4.11和org.codehaus.groovy:groovy-all:2.3.11,这个下载过程非常慢(好吧,其实是公司网络比较坑),耐心等待。

  • 6、jar包下载好之后,会自动创建main和test文件夹(其实gradle默认工程的创建也是在执行gradle任务),此时文件结构如下,注意groovy和java文件夹为蓝色的

  • 7、在build.gradle的dependencies里面加入
    compile gradleApi()
    compile localGroovy()
  • 8、在groovy文件夹下创建一个package,包名随不起,就叫com.fish好了,然后在里面new一个groovy类就叫FirstPlugin好了,并且让FirstPlugin实现Plugin接口,这个Plugin是org.gradle.api.Plugin。然后实现apply接口,加点代码,最后代码如下,我们创建了一个task叫做showTipTask,task在funny这个group内(我们可以对task进行分组,待会会明白),showTipTask只是打印出一行文字。description是对这个task的描述,当用户执行./gradlew tasks会显示出来。
package com.fish

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

/**
 * Created by fish on 17/1/24.
 */
class FirstPlugin implements Plugin<Project> {
    void apply(Project project) {
        def showTipTask = project.tasks.create("showTips") << {
            println(‘hello I am the first custom plguin‘)
        }
        showTipTask.group = "funny"
        showTipTask.description = "Hello baby"

    }
}
  • 9、此时plugin已经有了,就是FirstPlugin,我们需要把他传到Maven Central或者jcenter上,这样大家都可以用了,这里只是个demo,我就不上传了,我把他放在本地。如何配置:

    在build.gradle内加如下代码,这些代码事件上是定义了一个task叫uploadArchives,执行uploadArchives就会把gradle插件打包然后上传到本地或者远端。

apply plugin: ‘maven‘

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: uri(‘repo‘))
        }
    }
}
  • 10、此时可以尝试生成插件,执行uploadArchives这个任务就行,有2种方法。方法1是点击view-tool windows-gradle,在右边找到uploadArchives,找不到的话可以点击蓝色刷新按钮刷新一下,如下所示

方法2是还可以在IJ的terminal窗口执行./gradlew uploadArchives,推荐使用这种方法,可以看到清楚的日志,特别是失败时日志信息很关键

10、不幸的是,失败了,日志如下

Starting a Gradle Daemon (subsequent builds will be faster)
:compileJava UP-TO-DATE
:compileGroovy FAILED

FAILURE: Build failed with an exception.

可以用./gradlew uploadArchives --stacktrace看更详细的信息,得到信息如下所示

Caused by: groovy.lang.GroovyRuntimeException: Conflicting module versions. Module [groovy-all is loaded in version 2.4.7 and you are trying to load version 2.3.11
        ... 10 more

看来是有2个groovy-all,原来IJ依赖了我默认的groovy是2.4.7版本的,然后这里工程又依赖了2.3.11版本的,所以当然会出错了,解决方法是在build.gradle里注释掉compile ‘org.codehaus.groovy:groovy-all:2.3.11‘这行代码。

11、我们再执行./gradlew uploadArchives --stacktrace又会发现如下问题,miss了一个file,想想漏了什么,我们没有指明pluginId

补上它,在main/resources下创建META-INF/gradle-plugins文件夹,在里面建一个properties文件,文件名随便起(包名格式),比如就叫com.apple.propeties,文件里配置类名

implementation-class=com.fish.FirstPlugin

好了run it,此时插件就生成了,生成的插件是主要是jar包,配置文件,结构如下

使用插件

new一个AS工程,叫UseShip好了

然后在根目录的build.gradle加依赖 classpath ‘com.netease:ship:1.0‘

,在app的build.gradle加apply plugin: ‘com.apple‘

。现在插件就导进来了,我们在执行apply plugin: ‘com.apple‘

的时候会调用FirstPlugin的apply方法,在apply方法内我们定义了一个showTipTask,这个task在funny这个group下,来,我们验证下,如下所示 ,果然找到了这个task

此时可以在terminal下执行./gradlew showTips,得到了正确结果,显示 “hello I am the first custom plguin”

192:UseShip fish$ ./gradlew showTips
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon: https://docs.gradle.org/2.14.1/userguide/gradle_daemon.html.
Incremental java compilation is an incubating feature.
:app:showTips
hello I am the first custom plguin

BUILD SUCCESSFUL

Total time: 9.344 secs

其他

我们这里pluginId故意起的跟GroupId、ArtifictId没什么关系,是为了区分清楚,但实际上他们往往是关联的。

THANKS

http://tools.android.com/build/gradleplugin

http://blog.bugtags.com/2016/03/28/embrace-android-studio-gradle-plugin/

https://docs.gradle.org/current/userguide/custom_plugins.html

Create a Standalone Gradle plugin for Android - a step-by-step guide

时间: 2024-08-05 04:59:40

用IntelliJ实现android gradle插件的相关文章

Android Gradle插件用户指南

原文Gradle Plugin User Guide - Android Tools Project Site samples see bottom of New Build System 参考Gradle For Android Training Course 1 简介 这篇文档是基于0.9版本的Gradle插件,1.0以前的版本由于不兼容,可能会有所不同 1.1 新的构建系统的目标 新构建系统的目标是: 使得代码和资源的重用更加简单 使得创建同一应用程序的不同版本更加容易,不管是多个apk版

Android Gradle插件用户指南(译)

Android Gradle插件用户指南(译) 原文Gradle Plugin User Guide - Android Tools Project Site samples see bottom of New Build System 参考Gradle For Android Training Course 1 简介 这篇文档是基于0.9版本的Gradle插件,1.0以前的版本由于不兼容,可能会有所不同 1.1 新的构建系统的目标 新构建系统的目标是: 使得代码和资源的重用更加简单 使得创建同

Intellij插件开发教程1:用Intellij出的Gradle插件进行开发

前言:之前看到网上大部分的Intellij开发教程都是采用Intellij官方文档的那个版本,配置Intellij SDK一大堆的. 现在给大家介绍简单的方法吧,我们组内大神找到的.我们需要用到的是Intellij的gradle插件 plugins { id "org.jetbrains.intellij" version "0.2.18" } 关于这款插件的介绍:Gradle Intellij Plugin 做出的效果图: 插件运行和debug只需要运行gradl

Android Gradle插件(plugin)版本(version)与Gradle、SDK Build Tools版本关系

具体关系如下图: 比如,Android Studio 2.0发布,其中有个新功能“Instant Run”,需要Android Gradle Plugin版本2.0.0以上,那么我们项目的.gradle文件就需要以下配置 buildscript { dependencies { classpath 'com.android.tools.build:gradle:2.0.0' } } Android Gradle Plugin 2.0.0对应所需的Gradle版本为“2.10 or higher”

Android Gradle插件学习

简介 Java工程有三大构建工具Ant, Maven, Gradle.Ant需要手工编写太多东西,Maven通过使用约定优于配置的策略管理项目依赖于项目构建,而且建有Maven中央仓库.Gradle也是使用约定优于配置的策略基于任务驱动型.并且能能管理依赖并从maven中央仓库或者jcenter拉取下载相关依赖(也可以自定义maven仓库地址)推荐Android工程采用jcenter,java工程采用maven仓库.自动化项目的构建. 认识Gradle是从AndroidStudio开始的. 采用

Android官方技术文档翻译——Gradle 插件用户指南(7)

本文译自Android官方技术文档<Gradle Plugin User Guide>,原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide. 翻译不易,转载请注明CSDN博客上的出处: http://blog.csdn.net/maosidiaoxian/article/details/42417779 前三章见<Android官方技术文档翻译--Gradle 插件用户指南(1-3)>. 第四章见&

如何在Android Gradle中添加原生so文件依赖

@author ASCE1885的 Github 简书 微博 CSDN 原文链接 背景 几个月前,基于Google的LevelDB,我为Android平台写了一个名为SnappyDB的键值数据库(NoSQL). 由于它使用到了原生C++代码,因此最终生成的文件除了Jars包还有so文件. 通过Maven仓库发布我们的函数库没有什么问题(只要你通过繁琐的发布流程),maven-android-plugin可以帮助我们包含共享库.Maven依赖规则使得我们可以指定想要获取的ABI(不同的CPU架构)

Android Gradle Plugin指南(四)——測试

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Testing 5.Testing(測试) 构建一个測试程序已经被集成到应用项目中,没有必要再专门建立一个測试项目. 5.1 Basics and Configuration(基本知识和配置) 正如前面所提到的,紧邻main sourceSet的就是androidTest sourceSet,默认路径在src/androidTest/下. 在这个測试so

Android Gradle Plugin指南(二)——基本项目

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Basic-Project 3.Basic Project(基本项目) 一个Gradle项目的构建过程定义在build.gradle文件中,位于项目的根目录下. 3.1 Simple build files(简单的构建文件) 一个最简单的Gradle纯Java项目的build.gradle文件包含以下内容: apply plugin: 'java' 这里