自定义task生成jar包

背景:之前转载过别人的在build.gradle中自定义task来打Jar包的文章

文章地址:http://blog.csdn.net/u010479969/article/details/76096162


如果是简单的单一工程需求,这个完全可以满足,但是作为如果想要支撑全公司的业务,这样就有一些麻烦了,如果公司有十个产品线,则需要十个产品线都加入这些代码,感觉还是挺麻烦的

所以想要开发自定义gradle插件,来实现这个功能,接入成本会降低一些.

好久没有写自定义插件了,所以这里记录下来,也是防止以后忘记。



首先记录一下,我们常规开发gradle插件的套路,

1.创建extensions来传递数据

package com.plugin.buildtool

import org.gradle.api.Project

/**
 *
 */
class ProviderJarPluginExtension {

    def archiveName = "provider.jar"
    def srcClassDir = ""


    ProviderJarPluginExtension(Project project){
        archiveName = project.name+".jar"
        srcClassDir = project.buildDir.absolutePath + "/intermediates/classes/release"
    }

}

project.extensions.create('providerJar', ProviderJarPluginExtension,project)

2.加入task

project.task(ProviderJarTask.NAME,type:ProviderJarTask, dependsOn: 'assembleRelease')

3.创建task

import org.gradle.api.tasks.bundling.Jar

/**
 *
 */
class ProviderJarTask extends Jar {

    static final String NAME = "providerJar"
    String archiveName
    String srcClassDir

    ProviderJarTask() {
        group = "hummingbird"
        description = ""
        if(archiveName == null){
            archiveName = project.providerJar.archiveName
        }

        if(srcClassDir == null){
            srcClassDir = project.providerJar.srcClassDir
        }
        from(srcClassDir)

    }
}

这样就可以完成一个插件话开发

然后

./gradlew providerJar

就会在build/libs/下生成project.name.jar文件,


我们也可以,将jar包移动到我们需要的目录下,


扩展:我们还可以增加过滤等手段来处理我们的jar包


扩展:增加过滤的文件类型,例如,过滤掉某些R.class类型文件

    ProviderJarTask() {
        if(srcClassDir == null){
            srcClassDir = project.providerJar.srcClassDir
        }

        if(archiveName == null){
            archiveName = project.providerJar.archiveName
        }
        from(srcClassDir)
        String packageName = project.android.defaultConfig.applicationId   //获取当前工程包名
        String p = packageName.replace('.',File.separator);  //将包名转化为路径
        exclude{
            if(!it.path.startsWith(p)){   //当前包名下的R不过滤,其他的R统统删掉
                it.name.endsWith('R.class');
            } else {
                return false
            }
        }
        exclude {
            if(!it.path.startsWith(p)){
                it.name.startsWith('R$');
            } else {
                return false
            }
        }
    }


你可能感兴趣的:(gradle学习)