1. 程式人生 > >自定義task生成jar包

自定義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
            }
        }
    }