构建默认插件

在Android Studio中创建一个标准的Android项目,整个目录结构如下所示。

  1. ├── app
  2. ├── build.gradle
  3. ├── libs
  4. └── src
  5. ├── androidTest
  6. └── java
  7. ├── main
  8. ├── AndroidManifest.xml
  9. ├── java
  10. └── res
  11. └── test
  12. ├── build.gradle
  13. ├── buildSrc
  14. ├── build.gradle ---1
  15. └── src
  16. └── main
  17. ├── groovy ---2
  18. └── resources ---3
  19. ├── gradle
  20. └── wrapper
  21. ├── gradle-wrapper.jar
  22. └── gradle-wrapper.properties
  23. ├── gradle.properties
  24. ├── gradlew
  25. ├── gradlew.bat
  26. ├── local.properties
  27. └── settings.gradle

其中,除了buildSrc目录以外都是标准的Android目录。而buildSrc就是Gradle提供的在项目中配置自定义插件的默认目录。开发Gradle要创建的目录,也就是RootProject/src/main/groovy和RootProject/src/main/resources两个目录。

在配置完成后,如果配置正确,则对应的文件夹将被IDE识别成为对应类别的文件夹。

创建buildSrc/build.gradle—-1

首先,配置buildSrc目录下的build.gradle文件。这个配置比较固定,脚本如下所示。

  1. apply plugin: 'groovy'
  2.  
  3. dependencies {
  4. compile gradleApi()
  5. compile localGroovy()
  6. }

创建Groovy脚本—-2

接下来,在groovy目录下创建一个Groovy类(与Java类似可以带包名,但Groovy类以.grovvy结尾),如图4.42所示。

构建默认插件 - 图1 图4.42 设置主Groovy类

在脚本中通过实现Gradle的Plugin接口,实现apply方法即可,脚本如下所示。

  1. package com.xys
  2.  
  3. import org.gradle.api.Plugin
  4. import org.gradle.api.Project
  5.  
  6. public class MainPluginForBuildSrc implements Plugin<Project> {
  7.  
  8. @Override
  9. void apply(Project project) {
  10. project.task('testPlugin') << {
  11. println "Hello gradle plugin in src"
  12. }
  13. }
  14. }

在脚本的apply方法中,笔者简单实现了一个Task命名为testPlugin,执行该Task会输出一行日志。

创建Groovy脚本的Extension

所谓Groovy脚本的Extension,实际上就是类似于Gradle的配置信息。在主项目使用自定义的Gradle插件时,可以在主项目的build.gradle脚本中通过Extension传递一些配置、参数。

创建一个Extension,只需要创建一个Groovy类即可,如图4.43所示。

构建默认插件 - 图2 图4.43 创建Extension

笔者命名了一个叫MyExtension的Groovy类,其脚本如下所示。

  1. package com.xys;
  2.  
  3. class MyExtension {
  4. String message
  5. }

MyExtension代码非常简单,就是定义了要配置的参数变量。后面笔者将具体演示如何使用。

在Groovy脚本中使用Extension

在创建了Extension之后,需要修改之前创建的Groovy类来加载Extension,修改后的脚本如下所示。

  1. package com.xys
  2.  
  3. import org.gradle.api.Plugin
  4. import org.gradle.api.Project
  5.  
  6. public class MainPluginForBuildSrc implements Plugin<Project> {
  7.  
  8. @Override
  9. void apply(Project project) {
  10.  
  11. project.extensions.create('pluginsrc', MyExtension)
  12.  
  13. project.task('testPlugin') << {
  14. println project.pluginsrc.message
  15. }
  16. }
  17. }

通过project.extensions.create方法,将一个Extension配置给Gradle即可。

创建resources—-3

resources目录是标识整个插件的目录,其目录下的结构如下所示。

  1. └── resources
  2. └── META-INF
  3. └── gradle-plugins

该目录结构与buildSrc一样,是Gradle插件的默认目录,不能有任何修改。创建好这些目录后,在gradle-plugins目录下创建——插件名.properties文件,如图4.44所示。

构建默认插件 - 图3 图4.44 插件properties文件

这里笔者命名为pluginsrc.properties,在该文件中代码如下所示。

  1. implementation-class=com.xys.MainPluginForBuildSrc

通过上面的代码指定最开始创建的Groovy类即可。

在主项目中使用插件

在主项目的build.gradle文件中,通过apply指令加载自定义的插件,脚本如下所示。

  1. apply plugin: 'pluginsrc'

其中plugin的名字就是前面创建pluginsrc.properties中的名字——pluginsrc,通过这种方式加载了自定义的插件。

配置Extension

在主项目的build.gradle文件中,通过如下所示的代码加载Extension。

  1. pluginsrc{
  2. message = 'hello gradle plugin'
  3. }

同样领域名为插件名,配置的参数就是在Extension中定义的参数名。

配置完毕后,就可以在主项目中使用自定义的插件了。在终端执行gradle testPlugin指令,结果如下所示。

  1. :app:testPlugin
  2. hello gradle plugin