Mark Dappollone
Mark Dappollone

Follow

12. maj, 2020 – 3 min read

Bygning af Gradle-plugins er ikke nyt, og Kotlin er ikke nyt, og Android er ikke nyt. På samme måde er det ikke nyt at bygge Gradle-plugins i Kotlin, og det er heller ikke nyt at bygge Gradle-plugins til Android-apps. Men at bygge Gradle-plugins i Kotlin til Android? Tja, det er der faktisk bare ikke så mange oplysninger om.

Hvor vi går i gang, vil jeg lige nævne, at det på mange måder er meget nemmere at skrive Gradle-plugins til Android, hvis du skriver i Groovy. Men hvis det, vi ville gøre, var nemt, ville vi ikke tale om det. Så lad os bare holde os til planen.

Ignorer ham.

Så der er masser af ressourcer derude om at bygge plugins i Kotlin, og mange er gode, så hvis du bare starter fra bunden, så gå måske ud og google det, før du fortsætter, for vi springer lige til de gode ting: Hvordan får du adgang til Android-skrammel inde i dit Kotlin Gradle-plugin? Godt du spurgte.

Velkommen…

Først af alt, hvad mener vi med “Android junk”? Tja, når dit gradle build-script kører for at bygge din Android-app, vil android application plugin’et tilføje en masse opgaver til dit build, og du vil konfigurere disse opgaver i android closure, som plugin’et bruger til konfiguration. Din android closure i din build.gradle-fil kan se nogenlunde sådan ud:

Og hvis du opretter dit eget plugin, vil du måske gerne kende nogle af de ting i denne closure eller andre ting, som AGP’en gør. For groovy er alt dette ret nemt og ligetil, fordi groovy ikke kræver, at du eksplicit skal importere noget. Men med Kotlin kan du ikke slippe afsted med det. Så det første, du skal gøre, er at tilføje en afhængighed i din Gradle-plugin’s build.gradle-fil til Android Gradle Plugin. Så i dit plugin’s build.gradle script skal du bruge:

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

Nøglen her er den sidste linje. Vi bruger compileOnly, da denne afhængighed på køretid vil blive leveret af build.scriptet for den Android-applikation, der anvender dit plugin, i dens build-script. Alt, hvad vi har brug for, er, at dit plugin er opmærksom på AGP, så vi kan bruge de API’er, det giver.

The Kotlin Part

Nu hvor afhængigheden er inkluderet, kan vores plugin endelig få adgang til det søde Android-skrammel:

Hvis du ønsker at få adgang til android closure i dit plugin, skal du først hente en instans af build’ets AppExtension. Gør dette ved hjælp af linjen:

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

Når du har AppExtension-instansen, kan du gøre alle mulige ting, f.eks. forhøre dig om app-varianterne, tilføje opgaver i Android-bygningens livscyklus ved hjælp af funktionen dependsOn() og endda, som det foreslås i eksemplet ovenfor, generere nye kildefiler og kompilere dem i dit projekt.

Articles

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.