背景:之前转载过别人的在build.gradle中自定义task来打Jar包的文章
文章地址:http://blog.youkuaiyun.com/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
}
}
}