Android如何自定义Gradle插件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/dbs1215/article/details/81014405

Android-如何自定义gradle插件

自定义gradle插件可以实现定制自己的构建流程,以达到复用目的;

##1. 自定义插件方式
自定义插件有三种方式

  1. 添加脚步

    在你的app项目的build.gradle中直接使用groovy脚步语言编写插件
    这样方式好处是插件能自动变异且被包含到构建脚步中,你无需做任何处理;缺点是插件到逻辑都放到都build.gradle中去了,增加了脚步的复杂度且无法复用

  2. 添加buildSrc工程

    在根目录添加buildSrc子Module,这种方式比前一种好些,将插件的代码统一放到buildSrc工程中去了,但还是做不到别的工程能够使用它

  3. 单独新建一个工程

    这种方式最优,将插件集中在一个单独的工程中,且发布到gradle后,别的工程能够轻松复用它

##2. 自定义插件实现

###2.1 第一种------添加脚步

在你的主工程app module的build.gradle中直接添加脚步

Example:


class HelloConfigExtension {
    String msg = 'Hello gradle plugin'
}

class HelloPlugin implements Plugin<Project> {
   
   void apply(Project project) {
		
		// Add the 'hello' extension object
       def extension = project.extensions.create('hello', HelloConfigExtension)
       project.task('hello') {
           doLast {
               println extension.msg
           }
       }
   }
}

// Apply the plugin
apply plugin: HelloPlugin

//Config the extension
hello{
	msg = 'hello from gradle'
}

在控制台输入 ./gradlew -q hello

> gradle -q hello
hello from gradle

上述命令表明需要执行一个hello任务 -q表示除去打印日志(错误日志除外);因为我们在插件中定义了一个hello任务,这个任务就是打印从gradle传入的msg参数;

这样一个简单的插件就实现了,当然完全可以根据自己的业务需求实现自己的插件

##2.2 第二种------添加buildSrc Module

在根工程中添加手工添加一个buildSrc 目录结构如下

这里写图片描述

  1. 新建自己插件类

    图片中的二个类都是groovy类(路径必须是在src/main/groovy下),其实就是对应第一种在gradle脚步中写的HelloPlugin和HelloConfigExtension类;

  2. 新建配置文件

    在groovy同一层级新建resouces/META-INF/gradle-plugins目录
    新建一个名为youPluginId.properties 在里面添加

    注意:这里面的文件的名称就是你自定义插件的id,当你在主工程引用是需要使用此插件id号进行引用

    #这里面要替换成你自己的全路径插件名
    implementation-class=com.fzm.plugin.PostBuildPlugin
    
  3. 新建build.gradle

    在buildSrc目录下新建,并添加如下脚步即可

    apply plugin: 'groovy'
    
    dependencies {
        compile gradleApi()
        compile localGroovy()
    }
    
    repositories {
        mavenCentral()
    }
    

这样第二中自定义插件写法步骤就介绍完毕类,如何引用呢?很简单
,你可以在你的主工程app moudle的build.gradle 添加如下脚步

```
apply plugin: 'you plugin id'

//example
//apply plugin: 'com.fzm.post.build.plugin'
```

2.3 第三种------单独工程

  1. 插件的编写

    新建一个Android工程,再新建一个专门编写插件的module

    复制第二种方法中buildSrc中的src和build.gradle文件到plugin moudle中
    因为第三种可以将自己插件发布到gradle上去,所以这里的build.gradle需要修改
    格式如下,参考示例Demo

    plugins {
        id "com.gradle.plugin-publish" version "0.9.10"
    }
    
    
    // Apply other plugins here, e.g. java plugin for a plugin written in java or
    // the groovy plugin for a plugin written in groovy
    
    apply plugin:'groovy'
    
    repositories {
        jcenter()
    }
    
    dependencies {
        compile gradleApi()
        compile localGroovy() //not needed for Java plugins
        // other dependencies that your plugin requires
    }
    
    
    // Unless overridden in the pluginBundle config DSL, the project version will
    // be used as your plugin version when publishing
    version = "plugin version"
    group = "plugin group name"
    
    // The configuration example below shows the minimum required properties
    // configured to publish your plugin to the plugin portal
    pluginBundle {
        website = 'project website'
        vcsUrl = 'project repository address'
        description = 'plugin description'
        tags = ['xxx', 'xxx','xxx']
    
        plugins {
            postBuildPlugin {
                id = 'your plugin id'
                displayName = 'your plugin name'
            }
        }
    }
    
    sourceCompatibility = "1.8"
    targetCompatibility = "1.8"
    
  2. 插件的发布

    先去gradle官网注册账号,有的话直接登录

    这里写图片描述

    展开AS中右侧工具栏,找到你插件的module->plugin portal 右击 login 执行即可

    这里写图片描述

    顺利的话登录会成功,点击控制台链接即可,接下来准备发布操作,右击publishPlugins执行run即可,顺利话,发布成功的话你会看到这样

    这里写图片描述

    注意:每次发布的版本都不能是之前存在过的,否则会发布失败

    如果想直接通过控制台操作,可以使用如下命令

    ./gradlew yourPluginModuleName:publishPlugins
    
  3. 引用
    当你发布插件成功后,你可以去官网搜索你发布的插件(通过插件id),已了解你发布插件的信息,里面有如何使用自自定义插件的说明

    别的工程只要在根工程build.gradle添加类似如下代码即可

    //较高gradle版本写法:Build script snippet for plugins DSL for Gradle 2.1 and later:
    plugins {
      id "com.fzm.post.build.plugin" version "1.0.21"
    }
    
    
    //低版本写法或者动态配置时需要
    //Build script snippet for use in older Gradle versions or where dynamic configuration is required:
    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21"
      }
    }
    
    apply plugin: "com.fzm.post.build.plugin"
    
    

    本人发现高版本写法也可以放到主工程的build.gradle前提要放在apply plugin:xxxxx前面;而第二中写法比较灵活,因为apply plugin:"your plugin id"可以放到 别的插件之后,这样你可以做很多的事情;

2.4 差异(也许对你灰常有用哦)

  1. 插件引用方式

    不知道大家又没注意这三种引用插件的方式其实是有差别的
    第一种

    apply plugin: yourPluginName
    

    第二种:

     app plugin: yourPluginId
    

    第三种:

    //way 1 
    //add in app project's build.gradle
     plugins {
      id 'pluginId' version "plugiVersion"
    }
    
    //way 2
    //add in root project's build.gradle
    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.fzm.post.build:post-build-plugin:1.0.21"
      }
    }
    
    //add in app project's build.gradle
    apply plugin: "com.fzm.post.build.plugin"	
    	
    

    前二中都是直接在主工程build.gradle 直接使用且可以放到apply plugin: ‘com.android.application’ 后面哦,
    第三种第一种引用方式只能放到apply plugin: xxx前面

    这种差异意味着第三种第一个方式不能拦截assemleDebug/Release之类的任务,而前二种则是可以的,如果要hook的话就使用灵活的第三种第二个方式,就能实现hook相关动作

  2. 插件的构成:打包后的插件其实就是一个jar它包含java,groovy这些类编译成的字节码,像python脚本文件会自动丢弃,所以你如果想在插件中调用python之类需要指定路径,python文件不可以放到插件中去

2.5 插件的调试

1. 调试
方法一:开发插件时建议先使用第二种方式,这样便于调试错误;等插件功能开发完毕后,再使用第三种方式发布集成引用;

方法二:使用本地仓库调试

在你的插件模块的build.gradle文件加入如下代码

repositories {
    mavenLocal() //add
    mavenCentral()
}


// 指定本地上传的路径
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath //add

uploadArchives {
    repositories {
        mavenDeployer {
           repository(url: localMavenRepo) //add
            snapshotRepository(url: localMavenRepo) //add
        }
    }
}

./gradlew clean install
再执行上传操作即可(uploadArchives)

2. 其他工程引用

buildscript {
    repositories {
        mavenLocal() //add
        mavenCentral()
        ...
    }
    dependencies {
        classpath 'yougroup:name:1.0.0' //add
    }
}

allprojects {
    repositories {
        mavenLocal() //add
        mavenCentral()
       ...
    }
}

猜你喜欢

转载自blog.csdn.net/dbs1215/article/details/81014405