build.gradleにfragment-ktxやactivity-ktxの記述は必要?不要?
いろいろなサンプルやWebの情報を参考にAndroidアプリを開発していると、build.gradleがだんだんカオスになりがちです。そんなgradleファイルの記述の中でも、xxx-ktxというモジュールの依存関係は、サンプルによって書かれていたりいなかったり、削除したらエラーになったりならなかったりして、結局どんなときに必要なのか気になったので調べました。
そもそもktxとは何ぞや?
Android Developersによると、
Android KTX は、Android Jetpack およびその他の Android ライブラリに含まれる Kotlin 拡張機能セットです。
とのこと。ktxはおそらく、KoTlin eXtensionの略だと思われます。AndroidのAPIは基本的にJavaとKotlinで同じものが用意されていますが、拡張関数やコルーチンなどのKotlinの便利な機能を使って、より簡潔にソースコードを書けるように用意されたKotlin専用API、それがktx、ということのようです。
サンプルによって書かれていたりいなかったりする理由の一つが、Kotlin専用ということだと思います。Javaで書かれたサンプルではktxモジュールは使われていないはずです。
ktxにはどんなモジュールがある?
ktxモジュールの一覧もAndroid Developersで見つけました。AndroidXモジュールに含まれるKTXモジュールは以下の表のとおりです。各KTXモジュールは、Core KTXのように複数のパッケージから構成されている場合と、Fragment KTXのように単一のパッケージで構成されている場合があります。
| KTXモジュール | build.gradleに追加する依存関係 |
|---|---|
| Core KTX | androidx.core:core-ktx |
| Collection KTX | androidx.collection:collection-ktx |
| Fragment KTX | androidx.fragment:fragment-ktx |
| Lifecycle KTX | androidx.lifecycle:lifecycle-runtime-ktx |
| LiveData KTX | androidx.lifecycle:lifecycle-livedata-ktx |
| Navigation KTX | androidx.navigation:navigation-runtime-ktx androidx.navigation:navigation-fragment-ktx androidx.navigation:navigation-ui-ktx |
| Palette KTX | androidx.palette:palette-ktx |
| Reactive Streams KTX | androidx.lifecycle:lifecycle-reactivestreams-ktx |
| Room KTX | androidx.room:room-ktx |
| SQLite KTX | androidx.sqlite:sqlite-ktx |
| ViewModel KTX | androidx.lifecycle:lifecycle-viewmodel-ktx |
| WorkManager KTX | androidx.work:work-runtime-ktx |
結局ktxの記述は必要?
KTXの正体が判明したところで、build.gradleのxxx-ktxの依存関係の記述は、結局必要なのでしょうか。
まず、ソースコードがJavaで書かれている場合は不要です。ktxの依存関係を追加してもJavaでは意味がありません。
あとは、実際にKTXで定義されている関数などを使う場合は、依存関係を追加する必要があります。Android DevelopersのReferenceでパッケージのOverviewのページを見ると、Extension functionsという項目が書かれているパッケージがあります。これがKTXの関数ですので、ここに書かれている関数を使いたい場合は、build.gradleに依存関係を追加する必要があります。例えばandroidx.core.animationパッケージのOverviewのページを見ると、Extension functionsにいくつかの関数の説明があることが分かります。addListener()などの関数を使うには、
dependencies { implementation("androidx.core:core-ktx:1.6.0")}のようにbuild.gradleに書く必要があります。
よく使うKTXモジュール
統計を取ったわけではないですが、よく使うKTXモジュールはCore KTX, Fragment KTXあたりかなあと思います。
Core KTXはAndroid Studioで新規プロジェクトを作成すると、デフォルトで依存関係が追加されています。Animationなどの便利な拡張機能が定義されているので、KTXの機能と知らずに使っているケースもあるのではないかと思います。
Fragment KTXには、FragmentManagerの拡張関数や、Fragmentの結果を受け渡すためのAPIなどが用意されていて、これも便利です。
まとめ
build.gradleのxxx-ktxという記述は、Kotlinによる拡張機能を含んだKTXモジュールへの依存関係でした。Android DevelopersのReferenceのExtension functionsに書かれている関数を使うためには、KTXモジュールへの依存関係を追加する必要があります。