Android Gradle自定义插件

一、Gradle插件介绍

        Android Gradle插件中,包含了一些task可以帮我们做一些编译、引入依赖、打包等工作,比如assembleBuild,clean等等。

二、Gradle编写

        1、新建一个Android Library,命名为demo-plugin,然后删掉之前的java文件夹,并创建一个Groovy文件夹,因为,我们是使用Groovy来编写Gradle 插件的。

Android Gradle自定义插件_第1张图片

        2、将子项目的build.gralde文件,修改为如下。因为我们需要使用Gradle提供的API,来编写Gradle 插件。

apply plugin: 'groovy'
apply plugin: 'java-gradle-plugin'

buildscript {
    ext.gradle_version = '3.4.0'
    repositories {
        google()
        jcenter()
    }
    dependencies {
//        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "com.android.tools.build:gradle:$gradle_version"
    }
}

dependencies {
    implementation gradleApi()
    implementation localGroovy()
}

        3、创建Gradle Task类

        我们需要创建一个Task类,然后在此类中定义我们需要的操作。如下,可以定义一个DemoTask,并执行网络下载操作。

package com.example.demoplugin

import groovy.json.JsonSlurper
import org.gradle.api.DefaultTask
import org.gradle.api.provider.Property
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.TaskAction
import org.json.JSONObject

abstract class DemoTask extends DefaultTask {

    @Input
    abstract public Property getUrl();

    @Input
    abstract public Property getRawDir();

    @TaskAction
    def downLoad() {
        // 网络下载
        def data = downLoadFromNetwork(getUrl().get())
        // 保存到raw下的content.txt
        def filePath = "${project.projectDir.absolutePath}/${getRawDir().get()}/content.txt"
        saveDataToFile(data, filePath)
    }

    def downLoadFromNetwork(String uri) {
        def json = new JsonSlurper().parse(url.toURL(), "utf-8")
        return json
    }

    def saveDataToFile(Object data, String filePath) {
        def file = new File(filePath)
        if (!file.exists()) {
            file.createNewFile()
        }
        def fileWriter = new FileWriter(new File(file))
        // 写入文件
        fileWriter.write(data.toString())
        fileWriter.flush()
        fileWriter.close()
    }
}

        使用@TaskAction注解,表明此Task执行时,需要执行的方法。@Input表示了此Task的输入。

        4、创建Gradle Plugin类和Extension类

        我们需要创建一个Plugin类,并将之前的Task类放到此Plugin类中,这样在插件执行时,就会执行之前定义的任务。同时,为了提供任务执行需要的输入,我们需要定义一个Extension类,来指出Plugin/Task执行需要的输入。

        1)、extension类

package com.example.demoplugin

import org.gradle.api.provider.Property

abstract class DemoExtension {

    abstract Property getUri()

    abstract Property getRawDir()

    DownLoadPluginExtension() {
        // 默认配置
        uri.convention("https://www.baidu.com")
    }
}

        2)、Plugin类

package com.example.demoplugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class DemoPlugin implements Plugin {
    void apply(Project project) {
        DemoExtension extension = project.extensions.create("demoConfig", DemoExtension)
        project.getTasks().register("demoTask", DemoTask, { task ->
            task.rawDir.set(extension.getRawDir())
            task.url.set(extension.getUri())
        })
    }
}

        5、定义Plugin的名称

        为了方便对Plugin进行使用,我们需要定义Plugin的名称,如下所示,在resources文件夹下创建META-INF.gradle-plugins文件夹,并创建“demoplugin.properties”文件,此文件表明Plugin的名称为demoplugin,并在此文件中使用implement-class指出来plugin的实现类。

Android Gradle自定义插件_第2张图片

三、Gradle使用

        1、将gradle plugin上传到maven仓库,在子项目demo-plugin的build.gradle里,添加如下代码:


apply plugin: 'maven'


uploadArchives {
    repositories {
        mavenDeployer {
            // url表示maven仓库的地址,需要输入用户名和密码
            repository(url: "https://xxxx/xxx"){
                authentication(userName: "name", password: "password")
            }
            pom.version = '1.0.0'
            pom.artifactId = 'demo-plugin'
            pom.groupId = 'com.example.demo'
        }
    }
}

        2、使用自定义gradle插件

buildscript {
    repositories {
        maven {
            url 'https://xxx/xxx'
        }
    }
    dependencies {
        classpath "com.example.demo:demo-plugin:1.0.0"
    }

}
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

apply plugin: 'demoplugin'

android {
    ......
}

demoConfig {
    // 配置插件的输入
    url = "https://www.baidu.com"
    rawDir = "src/main/res/raw"
}

project.afterEvaluate {
    // 将自定义的task添加在preBuild之前 执行
    tasks.getByName("preBuild") dependsOn('downloadMultiLanguage')
}

参考:

Gradle手册:Gradle User Manual

你可能感兴趣的:(Glide,android,gradle,android,java)