Androidのライブラリを作る時はKotlinを使わないほうが良いかも?

判断迷ってます。何か間違ってたら教えてください。

ライブラリにKotlinを使ってる場合、アプリ側に多少デメリットがあります。

アプリサイズ

Kotlinを使ったライブラリを依存関係に追加すると、こんな感じにKotlinのランタイムのライブラリも入ってきます。

\--- project :libkotlin
\--- org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.21
\--- org.jetbrains.kotlin:kotlin-stdlib:1.2.21
\--- org.jetbrains:annotations:13.0

アプリ側がJavaの場合は、その分、単純にアプリサイズが増加します。

とは言え、ライブラリ自体そんなに大きくないので、すごく増えるということはなさそうです。

ココに書いてる通り、全部で約934KBで、Proguardを使うともっと抑えられると思います。

Kotlin has a rather small runtime file size: the library is approximately 934KB (as of 1.2.21). This means Kotlin adds just a little to .apk file size.

無視できるレベルかなと思います。

バージョンのコンフリクト

では、アプリ側もKotlin使っていれば問題ないかといえば、そうではないです。

ライブラリ側とアプリ側のバージョンのコンフリクトが問題なる可能性があります。

+--- org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.21
| \--- org.jetbrains.kotlin:kotlin-stdlib:1.2.21
| \--- org.jetbrains:annotations:13.0
\--- project :libkotlin
\--- org.jetbrains.kotlin:kotlin-stdlib-jre7:1.2.0 -> 1.2.21 (*)

バージョンがコンフリクトした場合は、Gradleがデフォルトで自動で最新の方に合わせます。この例だと、アプリ側が 1.2.21 で、ライブラリ側が 1.2.0 を使っていますが、依存関係を見ると 1.2.0 -> 1.2.21 と変更されています。

詳しくは ココ を参考にしてください。

ちょっとKotlinの事情に詳しくないですが、今後バージョンアップで何かしらAPIが廃止された場合にライブラリ側が古いと実行時エラーになったりする可能性があります。

AOSP

少し内容とは外れるのですが、参考に。AOSPもバージョンのコンフリクトを避けるために公開APIの箇所にはKotlinを使わない方針ですね。

ただ、DataBindingRoomのAnnotation ProcessorではKotlinを使ってます。直接アプリ側が触れることはないので、問題ない感じですね。

まとめ

Kotlinで書いてあるライブラリもいくつか見たことありますが、実際どうなのでしょう。

Javaで書いておけば問題は回避できるけど、Kotlin使いたいって気持ちです。

難しい…

追記

Kotlinのバージョン互換についてのページを教えてもらいました。

あと、Kotlin使うかどうかはライブラリの目的に依存する、というアドバイスもいただきました。自社のKotlinアプリに使うのが前提ならKotlin使えばいいし、広く使われるようなものならJavaを使うという感じ。