Android Plugin for Gradle 笔记(一)

  • 前言

  Gradle 插件打包了可重用的构建逻辑,可在许多不同的项目和构建中使用。Gradle允许您实现自己的插件,因此您可以重复使用构建逻辑,并与他人共享。 

  以下是如何创建Plugin的具体流程

  • 开发工具

  Android Studio 3.6.3

  Gradle 5.6.4

  Groovy语言

  • Gradle Plugin 的打包方式
    • 构建脚本:插件逻辑写在 build.gradle 中,适用于逻辑简单的任务,但是该方式实现的插件在该构建脚本之外是不可见的,只能用于当前脚本。在这里不做介绍
    • buildSrc项目:该目录buildSrc被视为包含的构建。发现目录后,Gradle会自动编译并测试此代码,并将其放入构建脚本的类路径中。对于多项目构建,只能有一个buildSrc目录,该目录必须位于根项目目录中。 buildSrc应该比脚本插件更可取,因为它更易于维护,重构和测试代码。

    • 独立项目:您可以为插件创建一个单独的项目。这个项目产生并发布了一个JAR,您可以在多个版本中使用它并与他人共享。通常,此JAR可能包含一些插件,或将几个相关的任务类捆绑到一个库中。或两者的某种组合。
  • 构建脚本

创建一个简单的插件

build.gradle
 
class JYTPlugin implements Plugin<Project> {
    void apply(Project project) {
            println("========================");
            println("hello JY Test plugin!");
            println("========================");
    }
}

apply plugin: JYTPlugin

  

  • 创建一个buildSrc模块  

  复杂的构建逻辑通常很适合作为自定义任务或二进制插件进行封装。自定义任务和插件实现不应存在于构建脚本中。buildSrc只要不需要在多个独立项目之间共享代码,就可以非常方便地使用该代码。

  该目录buildSrc被视为包含的构建。发现目录后,Gradle会自动编译并测试此代码,并将其放入构建脚本的类路径中。对于多项目构建,只能有一个buildSrc目录,该目录必须位于根项目目录中。 buildSrc应该比脚本插件更可取,因为它更易于维护,重构和测试代码。

  buildSrc使用适用于Java和Groovy项目的相同源代码约定。它还提供对Gradle API的直接访问。其他依赖项可以在专用的build.gradle下声明buildSrc。

  我们看一下如何在Android Studio 中创建一个buildSrc 模块 并书写插件

  1. 首先,我们使用Android Studio 创建一个 Project 。

  2. 因为Android Studio 并没创建插件的模版,所以我们使用Android Library Module,并且命名Module 的名称为buildSrc,这里有个坑,文件夹的名字大小写必须匹配,不然的话编译的时候,Android Studio 会提示你“Duplicate root element buildSrc”

  

 

  注:因为android studio 会自动小写你的Module Name ,需要手动修改下

  3. 创建完成后,将src/mian下面的东西删除掉,清理掉build.gradle的内容,

  生成后的目录结构大概的情况如下

  

 

 

 

  4. 由于gradle是基于groovy,因此,我们开发的gradle插件相当于一个groovy项目。所以需要在main目录下新建groovy目录,这时候groovy文件夹会被Android识别为groovy源码目录,代码的部分有了,还需要配置文件的位置,需要在要在main目录下新建resources目录,相似的resources目录会被自动识别为资源文件夹,resources的目录的固定结构是resources/META-INF/gradle-plugins/xxx.properties ,

   有人会问了。为什么叫gradle-plugins,而不是gradle-plugin,难道下面可以配置多个?是的,下面可以配置多个,下面会说明properties文件的作用,理解了作用,你就会知道为什么会是s了

   下图是生成的目录结构

    

 

 

  5. 修改配置build.gradle

plugins {
    id 'groovy'
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

   6. 编写插件

  创建文件groovy文件,本次创建的是JYTPlugin.groovy

package com.jykit.plugin

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

class JYTPlugin implements Plugin<Project> {
    void apply(Project project) {
        println("========================");
        println("hello JY Test plugin!");
        println("========================");
    }
}

7. 配置插件

插件已经开发完了,如何才能外面的人知道尼?如何才能被其他人使用尼?白话描述为,你叫啥?

我们在上面目录结构的时候已经提到过配置文件是在放在resources/META-INF/gradle-plugins下的,我们需要在这个目录下创建一个properties文件,这个文件的名字就是你插件的名字,这个文件里面的内容就是你插件的实现的类关联,比如我们将我的插件命名为:JYTPluginName ,所以的我文件的名字叫JYTPluginName.properties,文件的内容配置为关联方法

implementation-class=com.jykit.plugin.JYTPlugin

   

 看下效果图

 

  7. 关联使用

  插件的配置已经完成,如果使用尼?

  我们只需要在App的build.gradle中调用就可以了。

apply plugin: 'com.android.application'
apply plugin: 'JYTPluginName' #JYTPluginName 这个名字就是我们创建的JYTPluginName.properties 配置文件的名字
...
...

   

  8. 看下效果

  好了,我们已经完成了一个buildSrc Module的简单开发,看下编译一下app项目,看下效果  

> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy UP-TO-DATE
> Task :buildSrc:processResources UP-TO-DATE
> Task :buildSrc:classes UP-TO-DATE
> Task :buildSrc:jar UP-TO-DATE
> Task :buildSrc:assemble UP-TO-DATE
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build UP-TO-DATE

> Configure project :app
========================
hello JY Test plugin!
========================

CONFIGURE SUCCESSFUL in 3s

CONFIGURE SUCCESSFUL in 126ms
  •  独立项目编译

   为什么要创建独立的项目?难道直接使用buildSrc方式创建不香吗?

   buildSrc的方式是便于调试和项目内部使用,如果说外部项目想要使用你的Plugin就需要重新再项目下去创建buildSrc,这样如果有问题需要版本修复的话,就难以统一管理了,所以Gradle 提供了一个插件管理的方法,下面我们动手看下如何创建一个独立的项目编译

  创建独立项目的优点

    1.  插件名字自定义,

    2. 可以统一进行版本管理

  1.  创建一个Android Plugin Module,创建方法和上面创建buildSrc的方法类似,只是项目的名称可以自定义,无需强制使用buildSrc,我们参照上面创建buildSrc的方法创建了一个JYTAlonePlugin

 

 

  2. 编写build.gradle 

plugins {
    id 'groovy'
    id 'maven'
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

   

  3. 编写插件  

package com.jykit.plugin

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

class JYTAlonePlugin implements Plugin<Project> {
    void apply(Project project) {
        println("========================");
        println("hello JY Alone Test plugin!");
        println("========================");
    }
}

   4. 编写配置文件

创建JYTAlonePluginName.properties并配置

implementation-class=com.jykit.plugin.JYTAlonePlugin

  

  看下整体的效果

 

 

  是不是很熟悉?没错,现在的步骤和创建buildSrc的东西都一样,只是Plugin的名字有差别而已

 

  5. 接下来,我们来配置打包,将我们的插件进行发布

  我们只需要在Module下的build.gradle后面填写一些配置就可以了

    1. goup插件的分组配置说明
    2. version 插件的版本管理
    3. 上传的Task  
group 'com.jykit.plugin.JYTAlonePlugin' #包名
version '1.0.0'    #版本号

repositories {
    mavenCentral()
}

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

   好了,我们配置好了,repository(url: uri('/Users/mac/.gradle/repos'))这里就写明了我们的插件的本地位置,我们可以打开Gradle的编译菜单

 

 

   我们就可以看到uploadArchives的Task了,执行下,等待结果。  

> Task :jytaloneplugin:compileJava NO-SOURCE
> Task :jytaloneplugin:compileGroovy UP-TO-DATE
> Task :jytaloneplugin:processResources UP-TO-DATE
> Task :jytaloneplugin:classes UP-TO-DATE
> Task :jytaloneplugin:jar UP-TO-DATE
> Task :jytaloneplugin:uploadArchives

BUILD SUCCESSFUL in 544ms
4 actionable tasks: 1 executed, 3 up-to-date
3:51:54 PM: Task execution finished 'uploadArchives'.

   可以看到,我们已经执行成功了,再去我们的配置的本地路径去看下

 

 

 

  我们的插件已经生成成功了。

  6. 使用插件

  使用插件也比较简单,可以参照android studio的自有插件的写法配置下

  在Project的build.gradle 中告知编译器,我需要使用本地仓库查找插件,并告知依赖的插件的名字

buildscript {
    
    repositories {
        google()
        jcenter()
        // 告知编译器,我需要使用本地仓库的位置
        maven {
            url uri('/Users/mac/.gradle/repos')
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
        //链接我的插件,其中 com.jykit.plugin.JYTAlonePlugin 为之前创建的group的名字 
        // jytaloneplugin 为你的Moudel的名字
       // 1.0.0 为配置的version
        classpath 'com.jykit.plugin.JYTAlonePlugin:jytaloneplugin:1.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

   配置完了如上配置,你可以编译一下工程,细心的同学会发现,你的的编译器中会显示在现在这个插件

  在需要使用app的build.gradle 中就可以配置这个Plugin的使用啦

apply plugin: 'JYTAlonePluginName' //JYTAlonePluginName 是你的配置JYTAlonePluginName.properties文件的名字

  

  OK ,我们去编译一下Project,看下效果

> Task :buildSrc:compileJava NO-SOURCE
> Task :buildSrc:compileGroovy UP-TO-DATE
> Task :buildSrc:processResources UP-TO-DATE
> Task :buildSrc:classes UP-TO-DATE
> Task :buildSrc:jar UP-TO-DATE
> Task :buildSrc:assemble UP-TO-DATE
> Task :buildSrc:compileTestJava NO-SOURCE
> Task :buildSrc:compileTestGroovy NO-SOURCE
> Task :buildSrc:processTestResources NO-SOURCE
> Task :buildSrc:testClasses UP-TO-DATE
> Task :buildSrc:test NO-SOURCE
> Task :buildSrc:check UP-TO-DATE
> Task :buildSrc:build UP-TO-DATE

> Configure project :app
========================
hello JY Alone Test plugin!
========================

CONFIGURE SUCCESSFUL in 2s

CONFIGURE SUCCESSFUL in 109ms

   

  关于网络的maven仓库或者在本地创建http的仓库,可以参照Nexus搭建

   以上是为了学习记录使用

 

  

 

posted @ 2020-06-04 16:13  菜鸟.兜兜  阅读(1434)  评论(0编辑  收藏  举报