Building Gradle Plugins não é novo, e Kotlin não é novo, e Android não é novo. Da mesma forma, construir plugins Gradle no Kotlin não é novo, e construir Gradle Plugins para aplicações Android também não é novo. Mas construir plugins Gradle, em Kotlin, para o Android? Bem, realmente não há muita informação lá fora sobre isso.
Antes de começarmos, vou apenas mencionar que escrever plugins para Android Gradle é, de muitas maneiras, muito mais fácil se você escrever no Groovy. Mas o que nós queríamos fazer era fácil, não estaríamos falando sobre isso. Então vamos nos ater ao plano.
Então há muitos recursos lá fora na construção de plugins no Kotlin, e muitos são ótimos, então se você está apenas começando do zero, talvez vá e procure no Google antes de continuar, porque nós vamos pular direto para o bom material: Como você tem acesso ao lixo do Android dentro do seu plugin Kotlin Gradle? Ainda bem que você perguntou.
Primeiro de tudo, o que queremos dizer com “lixo do Android”? Bem, quando seu gradle build script for executado para construir seu aplicativo Android, o plugin do aplicativo androide vai adicionar um monte de tarefas à sua construção, e você vai configurar essas tarefas no fechamento do androide que o plugin usa para configuração. O fechamento do android no seu arquivo build.gradle pode se parecer com isto:
E se você estiver criando seu próprio plugin, você pode querer saber algumas das coisas nesse fechamento, ou outras coisas que o AGP está fazendo. Para o groovy, isto é tudo muito fácil e direto, porque o groovy não requer que você importe nada explicitamente. Mas com o Kotlin, você não pode se safar com isso. Então, a primeira coisa que você precisa fazer é adicionar uma dependência no arquivo build.gradle do seu plugin Gradle no Android Gradle Plugin. Então, no script build.gradle do seu plugin, você vai precisar:
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")
}
A chave aqui é a última linha. Estamos usando compileOnly, já que, em tempo de execução, essa dependência será fornecida pelo build.script do aplicativo Android que aplica seu plugin, em seu script de compilação. Tudo que precisamos é que seu plugin esteja ciente do AGP, para que possamos usar as APIs que ele fornece.
A Parte Kotlin
Agora que a dependência está incluída, nosso plugin pode finalmente ter acesso a esse doce lixo do Android:
Se você quiser ter acesso ao fechamento do andróide em seu plugin, primeiro você precisará obter uma instância do AppExtension do build. Faça isso usando a linha:
val appExtension = project.extensions.findByType(AppExtension::class.java)
Após ter a instância AppExtension, você pode fazer todo tipo de coisa, como interrogar as variantes da app, adicionar tarefas no ciclo de vida do build Android usando a função dependOn(), e até mesmo, como sugerido pelo exemplo acima, gerar novos arquivos fonte e compilá-los no seu projeto.