Gradle プラグインの構築は新しくないし、Kotlin も新しくないし、Android も新しくはないです。 同じ意味で、Kotlin で Gradle プラグインを構築することは新しいことではなく、Android アプリケーションのための Gradle プラグインを構築することもそうではありません。 しかし、AndroidのためにKotlinでGradleプラグインを構築するのは?
始める前に、Android の Gradle プラグインを書くことは、多くの点で、Groovy で書くほうがはるかに簡単であるとだけ言っておきます。 しかし、私たちがやりたいことは簡単で、それについて話すことはないでしょう。
Kotlin でのプラグイン構築に関するたくさんのリソースがあり、多くは素晴らしいものです。 KotlinのGradleプラグインでAndroidのジャンクにアクセスするにはどうしたらいいですか?
まず最初に、「Android ジャンク」とは何でしょう? さて、Android アプリをビルドするために gradle ビルド スクリプトを実行すると、android アプリケーション プラグインはビルドにたくさんのタスクを追加することになり、プラグインが設定に使用する android クロージャでそれらのタスクを設定することになります。 build.gradle ファイル内の android クロージャは次のようになります:
また、独自のプラグインを作成している場合、そのクロージャ内のもの、または AGP が行っている他のもののいくつかを知りたいかもしれません。 groovyの場合、明示的に何かをインポートする必要がないので、これはすべてとても簡単でわかりやすいものです。 しかし、Kotlinではそのようなことはできません。 まず最初に、Gradleプラグインのbuild.gradleファイルにAndroid Gradle Pluginへの依存関係を追加します。 プラグインの build.gradle スクリプトには、次のものが必要です:
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")
}
ここで重要なのは、最後の行です。 compileOnly を使用しているのは、実行時に、この依存関係は、プラグインを適用する Android アプリケーションの build.script によって、そのビルドスクリプトで提供されるからです。 必要なのは、プラグインが AGP を認識し、それが提供する API を使用できるようにすることだけです。
The Kotlin Part
依存関係が含まれたので、プラグインはついに甘い Android junk:
プラグインで android クロージャーにアクセスしたい場合、最初にビルドの AppExtension インスタンスを取得する必要があります。 これを次の行で行います。
val appExtension = project.extensions.findByType(AppExtension::class.java)
いったん AppExtension インスタンスを取得すると、アプリの亜種の照会、dependOn() 関数を使った Android ビルド ライフサイクルのタスク追加、さらには上記の例で示唆されている、新しいソース ファイルの生成とプロジェクトでのそれらのコンパイルといったあらゆることができるようになります。