GradleのConvention plugins

今のAndroid開発ではマルチモジュール構成が当たり前になり、その分 build.gradle(.kts) ファイルが増え、それに伴いボイラープレートも増えています。

これに対応するためには様々な方法があると思いますが、今回はConvention Pluginsというのを紹介します。

Convention Plugins

Convention Pluginsというのは何か特別なGradle Pluginがあるわけではなく、プロジェクトの特定の用途で使用するGradle Pluginのことです。

以下のドキュメントでそう呼ばれています。

That is, Gradle plugins for your specific needs, which we call convention plugins.

雑に言うとプロジェクト固有のGradle Pluginを作ってそれを各モジュールで使おうということです。

実装方法

Convention Pluginは要はGradle Pluginを実装するということになります。なので、それとまったく一緒です。

とはいえ、Standalone Gradle Pluginを実装するにはそこそこ大変なので、今回は Precompiled script plugins を使って実装します。

これは build.gradle(.kts) をPrecompileしてPluginとして使用することが可能になります。

もちろんStandalone Pluginも使用できますので、興味がある人はそちらも調べてみてください。

buildSrcを使った実装

buildSrcを使ってConvention Pluginを実装してみます。 buildSrc 自体の解説は省略しますが、Gradleでは特別なディレクトリになっていて、自動的にコンパイルされclasspathに追加されます。

まずは buildSrc/build.gradle.kts を作成します。適宜バージョンは変更して大丈夫です。

次に、 buildSrc/src/main/kotlin の中にktsファイルを作ります。この例では、 com.example.application.gradle.kts という名前で作ります。これがPrecompiled script pluginsとなります。

例として以下のようにSDKまわりを設定したものを追加します。

これだけで設定完了です。

あとは、これを app/build.gradle(.kts) で使用します。

先程作成した、 com.example.application.gradle.kts はファイル名の gardle.kts より前がGradle Plugin IDとなり各モジュールで参照できるようになります。

com.android.applicationorg.jetbrains.kotlin.android のPluginは先程作ったPluginでapplyしてるので、指定するのは com.example.application だけで動きます。

今回はすごく単純なものでやってますが、他にKotlin等の設定なども共通化することも可能です。

ライブラリプロジェクトでは com.android.application の代わりに com.android.library を使用すれば使えますので、マルチモジュールにおいてはボイラープレートを減らすことが可能になります。

注意

注意としては、 buildSrc にある dependencies とプロジェクト直下にある build.gradleplugins ブロックで同じものを参照しているとエラーになります。

The request for this plugin could not be satisfied because the plugin is already on the classpath with an unknown version, so compatibility cannot be checked.

どうやら制限としてあるみたいなので、この場合はプロジェクト直下の build.gradle から plugins ブロックを削除してください。( includeBuild を使った場合はエラーになりません)

includeBuild を使って実装する

buidSrc とは違う方法として、 includeBuild を使用する方法があります。

基本的に buildSrc とは同じ実装になりますので、色々と省略します。

includeBuild についても細かくは解説しませんが、独立プロジェクトをビルド構成に含めるような感じになります。ドキュメント

Now In Android アプリでも使用されてるので、そちらも参考にすると良いと思います。Now In AndroidのほうではStandalone Pluginが使用されていますが、Precompiled script pluginsでも実装可能です。

Precompiled script plugins補足

Precompiled script pluginsから buildSrc 内のKotlinクラスを参照することも可能なので、定数なんかを定義しておいて、ktsから参照することも可能です。

サンプル

参考

余談

昔、Standalone Pluginで同じようなことを書いてた。このときは Convention Pluginsという言葉を知らなかった。

--

--

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store