Mark Dappollone
Mark Dappollone

Follow

May 12, 2020 – 3 min read

Das Erstellen von Gradle-Plugins ist nicht neu, und Kotlin ist nicht neu, und Android ist nicht neu. Ebenso ist die Erstellung von Gradle-Plugins in Kotlin nicht neu, und auch die Erstellung von Gradle-Plugins für Android-Apps ist nicht neu. Aber die Erstellung von Gradle-Plugins in Kotlin für Android? Nun, dazu gibt es nicht wirklich viele Informationen.

Bevor wir anfangen, möchte ich noch erwähnen, dass das Schreiben von Gradle-Plugins für Android in vielerlei Hinsicht viel einfacher ist, wenn man in Groovy schreibt. Aber wenn das, was wir tun wollten, einfach wäre, würden wir nicht darüber reden. Also halten wir uns einfach an den Plan.

Ignorieren Sie ihn.

Es gibt viele Ressourcen zur Erstellung von Plugins in Kotlin, und viele davon sind großartig, wenn Sie also gerade erst anfangen, sollten Sie vielleicht erst einmal googeln, bevor Sie weitermachen, denn wir werden gleich zu den guten Dingen kommen: Wie bekommt man Zugriff auf den Android-Müll in seinem Kotlin-Gradle-Plugin? Gut, dass du fragst.

Willkommen…

Zunächst einmal: Was meinen wir mit „Android-Müll“? Nun, wenn Ihr Gradle-Build-Skript läuft, um Ihre Android-Anwendung zu bauen, wird das Android-Anwendungs-Plugin eine Reihe von Aufgaben zu Ihrem Build hinzufügen, und Sie werden diese Aufgaben in der Android-Schließung konfigurieren, die das Plugin für die Konfiguration verwendet. Ihre android closure in Ihrer build.gradle-Datei könnte etwa so aussehen:

Und wenn Sie Ihr eigenes Plugin erstellen, möchten Sie vielleicht etwas von dem wissen, was in dieser closure steht, oder andere Dinge, die das AGP tut. Für Groovy ist das alles ziemlich einfach und unkompliziert, weil Groovy nicht verlangt, dass man etwas explizit importiert. Aber bei Kotlin ist das nicht möglich. Das erste, was Sie tun müssen, ist, eine Abhängigkeit in der build.gradle-Datei Ihres Gradle-Plugins vom Android Gradle Plugin hinzuzufügen. Im build.gradle-Skript Ihres Plugins benötigen Sie also:

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")
}

Der Schlüssel dazu ist die letzte Zeile. Wir verwenden compileOnly, da diese Abhängigkeit zur Laufzeit durch das build.script der Android-Anwendung, die Ihr Plugin anwendet, in ihrem Build-Skript bereitgestellt wird. Alles, was wir brauchen, ist, dass Ihr Plugin die AGP kennt, so dass wir die APIs nutzen können, die sie bereitstellt.

Der Kotlin-Teil

Nun, da die Abhängigkeit enthalten ist, kann unser Plugin endlich auf den süßen Android-Müll zugreifen:

Wenn Sie in Ihrem Plugin auf die Android-Schließung zugreifen möchten, müssen Sie zuerst eine Instanz der AppExtension des Builds erhalten. Verwenden Sie dazu die folgende Zeile:

val appExtension = project.extensions.findByType(AppExtension::class.java)

Sobald Sie die AppExtension-Instanz haben, können Sie alles Mögliche tun, z. B. die App-Varianten abfragen, mit der Funktion dependsOn() Aufgaben in den Android-Build-Lebenszyklus einfügen und sogar, wie im obigen Beispiel vorgeschlagen, neue Quelldateien generieren und sie in Ihr Projekt kompilieren.

Articles

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.