Explicación detallada de la creación de Gradle ExtensionContainer y el uso de parámetros de extensión (extensiones)

Explicación detallada de la creación de Gradle ExtensionContainer y el uso de parámetros de extensión (extensiones)


Cuando desarrollamos complementos de Gradle, la mayoría de los complementos necesitan obtener alguna configuración del script de compilación, de modo que se puedan pasar diferentes configuraciones al complemento de Gradle de acuerdo con diferentes proyectos sin modificar el código en el complemento. . Podemos usar ExtensionContainer para implementar extensiones de Gradle (capacidades de paso de parámetros).

ExtensionContainer

Cada Gradle Project mantiene un ExtensionContainer, al que podemos acceder a través de project.extensions, a través del cual podemos realizar la definición de propiedades y la adquisición de propiedades.

El objeto ExtensionContainer se puede obtener a través de la siguiente API de Project:

ExtensionContainer getExtensions()

Uso y funciones principales de la API de ExtensionContainer

ExtensionContainer puede crear extensiones (es decir, propiedades extendidas) a través de su método de creación.

El método de creación se define de la siguiente manera:

<T> T create(String name, Class<T> type, Object... constructionArguments)
<T> T create(Class<T> publicType, String name, Class<? extends T> instanceType, Object... constructionArguments)
  • publicType: el tipo de clase expuesto por la instancia de extensión creada;
  • nombre: El nombre de la Extensión que se creará, que puede ser cualquier cadena que cumpla con las reglas de nomenclatura, y no se puede repetir con la existente, de lo contrario se lanzará una excepción;
  • instanceType: el tipo de clase de la Extensión;
  • constructionArguments: valores de los parámetros del constructor de la clase

ejemplo

A continuación, implementemos un ejemplo simple de paso de parámetros.

1. En el complemento, defina los parámetros y las relaciones correspondientes

Primero, definimos un DemoPlugin del complemento de Gradle y usamos extensiones (también puede usar getExtensions()) para definir una propiedad de extensión (objeto de extensión):

class DemoPlugin implements Plugin<Project> {
  @Override
  void apply(Project project) {
      //定义 extConfig 属性,并且与 ExtConfig 进行绑定。
      project.extensions.create('extConfig', ExtConfig)
      project.tasks.create('printExtConfig') << {
          //通过 extConfig 属性,获取外部传递进来的 message 的具体内容。
          println("DemoPlugin message =" + project.extConfig.message)
      }
  }
}
class ExtConfig {
    String message
}

En el ejemplo, ExtConfig es una clase Groovy que tiene una propiedad de mensaje. Usar extensiones para agregar una extensión extConfig al proyecto es equivalente a configurar una propiedad extConfig para el proyecto.

ExtConfig es el modelo extendido, le agregamos un atributo de mensaje. Y vincule ExtConfig con la palabra clave 'extConfig' en la aplicación de DemoPlugin. Finalmente, cree una tarea 'printExtConfig' para la salida del registro.

Entonces, ¿cuál es el mecanismo de paso de parámetros?

Dado que la clase Project implementa la interfaz ExtensionAware, es extensible. El objeto ExtensionAware tiene un método getExtensions(), que devuelve un objeto ExtensionContainer, y el objeto ExtensionContainer puede registrar nuestra extensión a través del método create(). Por lo tanto, el cierre de extConfig se puede asociar con la clase de ExternalConfig, que es el mecanismo de extensión del complemento.

2. Utilice este parámetro

Hemos definido el parámetro extendido, y luego solo necesitamos usar este parámetro donde se usa el complemento Gradle y establecer el contenido del parámetro personalizado.

apply plugin: DemoPlugin

// 配置扩展
extConfig {
    message = 'hello world!'
}

Crear parámetros de extensión anidados

Este ejemplo es un parámetro extendido con objetos anidados:

class DemoPlugin implements Plugin<Project> {
  @Override
  void apply(Project project) {
      //定义 extConfig 属性,并且与 ExtConfig 进行绑定。
      project.extensions.create('extConfig', ExtConfig)
      project.extConfig.extensions.create('nestExt', PluginNestExtension)
      project.tasks.create('printExtConfig') << {
          //通过 extConfig 属性,获取外部传递进来的 message 的具体内容。
          println("DemoPlugin message =" + project.extConfig.message)
          println("DemoPlugin nestExt.nestParam1 =" + project.pluginExt.nestExt.nestParam1)
      }
  }
}
class ExtConfig {
    String message
}
class PluginNestExtension {
    def nestParam1='this is nestParam1'
    def nestParam2='this is nestParam2'
}

**PD: Para obtener más artículos relacionados con la optimización del rendimiento, consulte --> "Optimización del rendimiento de Android"
**PD: Para obtener más artículos relacionados con la optimización del rendimiento, consulte --> "Optimización del rendimiento de Android"
**PD: Para obtener más optimización del rendimiento Para artículos relacionados, consulte --> "Optimización del rendimiento de Android"

Supongo que te gusta

Origin blog.csdn.net/u011578734/article/details/114104568
Recomendado
Clasificación