一、Gradle插件介绍
Android Gradle插件中,包含了一些task可以帮我们做一些编译、引入依赖、打包等工作,比如assembleBuild,clean等等。
二、Gradle编写
1、新建一个Android Library,命名为demo-plugin,然后删掉之前的java文件夹,并创建一个Groovy文件夹,因为,我们是使用Groovy来编写Gradle 插件的。
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的实现类。
三、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