Att bygga Gradle-plugins är inte nytt, och Kotlin är inte nytt, och Android är inte nytt. På samma sätt är det inte nytt att bygga Gradle-plugins i Kotlin och inte heller att bygga Gradle-plugins för Android-appar. Men att bygga Gradle-plugins i Kotlin för Android? Tja, det finns egentligen bara inte så mycket information om det.
Innan vi börjar ska jag bara nämna att det på många sätt är mycket enklare att skriva Gradle-plugins för Android om du skriver i Groovy. Men om det vi ville göra var enkelt skulle vi inte prata om det. Så låt oss bara hålla oss till planen.
Det finns massor av resurser där ute för att bygga plugins i Kotlin, och många av dem är bra, så om du bara börjar från början, kanske du ska gå och googla på det innan du fortsätter, för vi kommer att hoppa rakt fram till de bra sakerna: Hur får du tillgång till Android junk in inuti ditt Kotlin Gradle-plugin? Glad att du frågade.
För det första, vad menar vi med ”Android skräp”? Jo, när ditt gradle-byggskript körs för att bygga din Android-applikation kommer insticksprogrammet för Android-applikation att lägga till ett gäng uppgifter till ditt bygge, och du kommer att konfigurera dessa uppgifter i android closure som insticksprogrammet använder för konfiguration. Din android closure i din build.gradle-fil kan se ut ungefär så här:
Och om du skapar ditt eget insticksprogram kanske du vill veta några av sakerna i denna closure, eller andra saker som AGP gör. För groovy är allt detta ganska enkelt och okomplicerat, eftersom groovy inte kräver att du explicit importerar något. Men med Kotlin kan du inte komma undan med det. Så det första du behöver göra är att lägga till ett beroende i din build.gradle-fil för Gradle-pluginet på Android Gradle-pluginet. Så i din insticksmoduls build.gradle-skript behöver du:
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")
}
Nyckeln här är den sista raden. Vi använder compileOnly, eftersom det här beroendet vid körning kommer att tillhandahållas av build.scriptet för den Android-applikation som tillämpar ditt insticksprogram, i dess build-script. Allt vi behöver är att ditt insticksprogram är medvetet om AGP, så att vi kan använda de API:er som det tillhandahåller.
The Kotlin Part
Nu när beroendet är inkluderat kan vårt insticksprogram äntligen få tillgång till det söta Android-skräpet:
Om du vill få tillgång till android closure i ditt insticksprogram måste du först få en instans av buildets AppExtension. Gör detta med hjälp av raden:
val appExtension = project.extensions.findByType(AppExtension::class.java)
När du väl har AppExtension-instansen kan du göra alla möjliga saker, som att fråga efter app-varianter, lägga till uppgifter i Android-byggens livscykel med hjälp av funktionen dependsOn(), och till och med, som exemplet ovan antyder, generera nya källkodsfiler och kompilera dem i ditt projekt.