build.gradleにfragment-ktxやactivity-ktxの記述は必要?不要?

いろいろなサンプルやWebの情報を参考にAndroidアプリを開発していると、build.gradleがだんだんカオスになりがちです。そんなgradleファイルの記述の中でも、xxx-ktxというモジュールの依存関係は、サンプルによって書かれていたりいなかったり、削除したらエラーになったりならなかったりして、結局どんなときに必要なのか気になったので調べました。

そもそもktxとは何ぞや?

Android Developersによると、

Android KTX は、Android Jetpack およびその他の Android ライブラリに含まれる Kotlin 拡張機能セットです。

https://developer.android.com/kotlin/ktx?hl=ja

とのこと。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 KTXandroidx.core:core-ktx
Collection KTXandroidx.collection:collection-ktx
Fragment KTXandroidx.fragment:fragment-ktx
Lifecycle KTXandroidx.lifecycle:lifecycle-runtime-ktx
LiveData KTXandroidx.lifecycle:lifecycle-livedata-ktx
Navigation KTXandroidx.navigation:navigation-runtime-ktx
androidx.navigation:navigation-fragment-ktx
androidx.navigation:navigation-ui-ktx
Palette KTXandroidx.palette:palette-ktx
Reactive Streams KTXandroidx.lifecycle:lifecycle-reactivestreams-ktx
Room KTXandroidx.room:room-ktx
SQLite KTXandroidx.sqlite:sqlite-ktx
ViewModel KTXandroidx.lifecycle:lifecycle-viewmodel-ktx
WorkManager KTXandroidx.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モジュールへの依存関係を追加する必要があります。