一、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 PropertygetUrl(); @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 PropertygetUri() 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)