Android中自定义gradle插件实现步骤记录

在build.gradle中直接实现插件

  • 创建使用插件功能的groovy 类,在app层的build.gradle 中

class GreetingPluginExtension {
   //插件类中的属性
   String message = "Hello"
}
  • 实现 org.gradle.api.Plugin 接口,在重新的apply() 方法中调用插件类

class GreetingPlugin implements Plugin<Project> {

   @Override
   void apply(Project target) {
       //生成插件类的对象,greeting 是插件类的别名,编译完成后可以用来使用闭包的形式修改插件类中的属性
       def extension = target.extensions.create("greeting", GreetingPluginExtension)
       target.task("hello") {//生产名为hello的任务,可以在命令行中使用 gradle hello 运行该任务
           doLast {
               println(extension.message)
           }
       }
   }
}
  • 在build.gradle中引入自定义的插件
 apply plugin: GreetingPlugin
  • 在Terminal中打开build.gradle 文件,运行 “ gradle hello ”,或者在Sync完成后在AS的Gradle列表中运行,如下图
    在这里插入图片描述
    在这里插入图片描述
  • 在build.gradle中使用插件的别名修改插件类中的属性,就像build.gradle默认生产的如下的代码一样,也可以使用相同的方式修改自定义插件中的属性,如下
 defaultConfig {
        applicationId "com.plugin.ggg.myapplication"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }

    apply plugin: GreetingPlugin //首先要先引入插件

    //修改插件类中的属性,再次运行hello ,便可以输出修改后的值
    greeting{
    message="1111"
}

如果运行 gradle hello 提示 gradle 不是内部命令时,请将AndroidStudio 安装目录下的 gradle/gradle-5.1.1(这个5.1.1是gradle的版本号)/bin 加入到环境变量的path中,重启一下电脑即可

独立于项目的插件

  • 在项目中新建 Android Library Module
  • 将src/main 中的文件都删除,将 module中的build.gradle 的内容都删除
  • 在 module中的build.gradle 中加入以下代码,并 sync
apply plugin: 'groovy'//引入 groovy支持的插件
apply plugin: 'maven' //引入maven支持的插件
dependencies {
    //引入 groovy支持的插件
    compile gradleApi()
    compile localGroovy()
}
//使用maven仓库
repositories {
    mavenCentral()
}
//定义插件的在本地maven中的id
 group = 'test.plugins'
//定义插件的在本地maven中的版本号
 version = '1.0.0'
//将插件打包上传到本地maven
uploadArchives {
    repositories {
        mavenDeployer {
            //指定本地maven的路径
            repository(url: uri('./repos'))
        }
    }
}

  • 在src/main 中新建groovy的文件夹,在里面新建.groovy文件,在src/main中新建 resources文件夹,在里面新建 META-INF 文件夹,在META-INF中新建 gradle-plugins 文件夹,这俩个文件夹的名称是固定的,然后在gradle-plugins中创建xxx.properties 文件,xxx可以自定义,这个将会作为插件在本地maven中group的值。目录结构如下图
    在这里插入图片描述

  • 插件类的实现如下代码

package gradle

import org.gradle.api.Plugin
import org.gradle.api.Project
//实现Plugin接口,重写apply 方法
class PluginImpl implements Plugin<Project> {

    @Override
    void apply(Project target) {
        //在这里实现插件功能
        System.out.println("========================")
        System.out.println("hello gradle plugin!")
        System.out.println("========================")
    }
}
  • xxx.properties 文件中内容如下
# 指定插件类的入口 ,包名.类名
implementation-class=gradle.PluginImpl
  • sync now 完之后 在命令行中打开 module中的 build.gradle 文件 输入“gradle uploadArchives” 命令 将插件发布到本地maven,或在AS中的Gradle 中发布,如下图
    在这里插入图片描述

  • 发布完之后在本地maven中会生产相应的仓库,"./repos" 指定的本地maven地址在module中的下一级文件夹中,所以maven生产的repos仓库如下图
    在这里插入图片描述

  • maven-metadata.xml 中的内容如下

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <!--插件在project 下面的build.gradle引入时的形式为[groupId]:[artifactId]:[version]-->
  <groupId>test.plugins</groupId>
  <artifactId>plugin</artifactId>
  <versioning>
    <release>1.0.0</release>
    <versions>
      <version>1.0.0</version>
    </versions>
    <lastUpdated>20190803052405</lastUpdated>
  </versioning>
</metadata>

  • 在项目中使用该插件,在project 的 build.gradle中引入本地maven的地址,代码如下
buildscript {
    ext.kotlin_version = '1.3.31'
    repositories {//声明了工程所需要的依赖库,供下面dependencies下载
        google()
        jcenter()
        maven {
            url uri("./plugin/repos") //本地maven中插件的地址
        }


    }
    dependencies {//声明了具体的依赖,使用[group]:[name]:[version]形式
        classpath 'com.android.tools.build:gradle:3.4.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        //引入插件的依赖
        classpath 'test.plugins:plugin:1.0.0'
    }
}
  • 在需要使用插件的module中引入插件
apply plugin: 'test.plugins'

修改插件代码后需要重新build并重新发布到本地的maven

猜你喜欢

转载自blog.csdn.net/genmenu/article/details/98337935