一、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.demopluginimport groovy.json.JsonSlurperimport org.gradle.api.DefaultTaskimport org.gradle.api.provider.Propertyimport org.gradle.api.tasks.Inputimport org.gradle.api.tasks.TaskActionimport org.json.JSonObjectabstract class DemoTask extends DefaultTask { @Input abstract public Property
使用@TaskAction注解,表明此Task执行时,需要执行的方法。@Input表示了此Task的输入。
4、创建Gradle Plugin类和Extension类
我们需要创建一个Plugin类,并将之前的Task类放到此Plugin类中,这样在插件执行时,就会执行之前定义的任务。同时,为了提供任务执行需要的输入,我们需要定义一个Extension类,来指出Plugin/Task执行需要的输入。
1)、extension类
package com.example.demopluginimport org.gradle.api.provider.Propertyabstract class DemoExtension { abstract Property
2)、Plugin类
package com.example.demopluginimport org.gradle.api.Pluginimport org.gradle.api.Projectclass DemoPlugin implements Plugin
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