A Gradle pluginok készítése nem új, a Kotlin sem új, és az Android sem új. Ugyanígy a Gradle pluginok Kotlin nyelven történő építése sem újdonság, és a Gradle pluginok építése Android alkalmazásokhoz sem. De Gradle pluginek építése Kotlinban, Androidhoz? Nos, erről tényleg nincs túl sok információ.
Mielőtt belevágnánk, csak megemlítem, hogy az Android Gradle pluginok írása sok szempontból sokkal egyszerűbb, ha Groovy-ban írsz. De amit mi akartunk csinálni, az egyszerű, akkor nem beszélnénk róla. Szóval maradjunk a tervnél.
Szóval rengeteg forrás létezik a Kotlin nyelvű pluginok készítéséről, és sok közülük nagyszerű, szóval ha most kezded a nulláról, talán menj és guglizz rá, mielőtt folytatnád, mert mi most rögtön a jó dolgokra fogunk ugrani: Hogyan férhetsz hozzá az Android szeméthez a Kotlin Gradle pluginodon belül? Örülök, hogy megkérdezted.
Először is, mit értünk “Android szemét” alatt? Nos, amikor a gradle build szkripted lefut az Android alkalmazásod építéséhez, az android alkalmazás plugin egy csomó feladatot fog hozzáadni a build-edhez, és ezeket a feladatokat az android bezárásban fogod konfigurálni, amit a plugin használ a konfigurációhoz. Az android closure a build.gradle fájlodban valahogy így nézhet ki:
És ha saját plugint készítesz, akkor lehet, hogy tudni akarsz néhány dolgot ebben a closureben, vagy más dolgokat, amiket az AGP csinál. A groovy esetében mindez elég könnyű és egyszerű, mert a groovy nem követeli meg, hogy explicit módon importálj bármit is. De a Kotlin esetében ezt nem lehet megúszni. Tehát az első dolog, amit tenned kell, hogy a Gradle plugin build.gradle fájljában függőséget adsz hozzá az Android Gradle Pluginhez. Tehát a plugin build.gradle szkriptjében szükséged lesz:
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 kulcs itt az utolsó sor. A compileOnly-t használjuk, mivel futáskor ezt a függőséget a pluginodat alkalmazó Android alkalmazás build.scriptje fogja biztosítani a build scriptjében. Nekünk csak arra van szükségünk, hogy a pluginunk tudjon az AGP-ről, így használhatjuk az általa biztosított API-kat.
A Kotlin rész
Most, hogy a függőség szerepel, a pluginunk végre hozzáférhet ahhoz az édes Android szeméthez:
Ha a pluginunkban hozzáférést akarunk kapni az android closure-hez, először a build’s AppExtension egy példányát kell megszereznünk. Ezt a következő sor segítségével teheti meg:
val appExtension = project.extensions.findByType(AppExtension::class.java)
Mihelyt megvan az AppExtension példánya, mindenféle dolgot megtehet, például lekérdezheti az alkalmazásváltozatokat, a dependsOn() függvény segítségével feladatokat adhat hozzá az Android build életciklusához, sőt, ahogy a fenti példa is sugallja, új forrásfájlokat generálhat és fordíthatja a projektjébe.