Construir plugins de Gradle no es nuevo, ni Kotlin es nuevo, ni Android es nuevo. Del mismo modo, construir plugins de Gradle en Kotlin no es nuevo, y tampoco lo es construir plugins de Gradle para aplicaciones Android. ¿Pero construir plugins de Gradle, en Kotlin, para Android? Bueno, realmente no hay mucha información al respecto.
Antes de empezar, sólo mencionaré que escribir plugins Gradle para Android es, en muchos sentidos, mucho más fácil si escribes en Groovy. Pero lo que queríamos hacer era fácil, no estaríamos hablando de ello. Así que vamos a ceñirnos al plan.
Así que hay un montón de recursos por ahí sobre la construcción de plugins en Kotlin, y muchos son geniales, así que si estás empezando desde cero, tal vez ir y buscar en Google antes de continuar, porque vamos a saltar directamente a lo bueno: ¿Cómo puedes acceder a la basura de Android dentro de tu plugin Gradle de Kotlin? Me alegro de que lo preguntes.
En primer lugar, ¿qué queremos decir con «basura de Android»? Bueno, cuando tu script de construcción gradle se ejecuta para construir tu aplicación Android, el plugin de la aplicación android va a añadir un montón de tareas a tu construcción, y vas a configurar esas tareas en el cierre android que el plugin utiliza para la configuración. Su cierre androide en su archivo build.gradle podría ser algo como esto:
Y si usted está creando su propio plugin, es posible que desee conocer algunas de las cosas en ese cierre, u otras cosas que la AGP está haciendo. Para groovy, todo esto es bastante fácil y directo, porque groovy no requiere que importes nada explícitamente. Pero con Kotlin, no puedes salirte con la tuya. Así que lo primero que tienes que hacer es añadir una dependencia en el archivo build.gradle de tu plugin de Gradle al plugin de Gradle para Android. Así que, en el script build.gradle de tu plugin, necesitarás:
dependencies {
implementation gradleApi()
implementation 'com.squareup:javapoet:1.10.0'
implementation 'com.squareup:kotlinpoet:1.0.0-RC1'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
compileOnly("com.android.tools.build:gradle:3.6.3")
}
La clave aquí es la última línea. Estamos usando compileOnly, ya que, en tiempo de ejecución, esta dependencia será proporcionada por el build.script de la aplicación Android que aplica tu plugin, en su script de construcción. Todo lo que necesitamos es que tu plugin sea consciente de la AGP, para que podamos utilizar las APIs que proporciona.
La parte de Kotlin
Ahora que la dependencia está incluida, nuestro plugin puede finalmente tener acceso a esa dulce basura de Android:
Si quieres tener acceso al cierre de android en tu plugin, primero necesitarás obtener una instancia de la AppExtension del build. Hazlo usando la línea:
val appExtension = project.extensions.findByType(AppExtension::class.java)
Una vez que tengas la instancia de AppExtension, puedes hacer todo tipo de cosas, como interrogar a las variantes de la aplicación, añadir tareas en el ciclo de vida de la construcción de Android usando la función dependsOn(), e incluso, como se sugiere en el ejemplo anterior, generar nuevos archivos fuente y compilarlos en tu proyecto.