Now in REALITY Tech #25 Android KSP導入に再挑戦した話
こんにちは、Androidエンジニアのtakashiです。
REALITYでは二ヶ月に一度改善Weekという取り組みが行われています。
今回の改善Weekでは、以前試みて導入できなかったKSPの再調査をしました。
前回のあらすじ
ここに前回KSP導入を試みた際の記事がありますが、
・ほかライブラリとの組み合わせでKotlinのバージョンを変えられなかった。
・quickstart通りにやってもうまく動かない。
という理由で断念していました。
今回の成果
今回の改善Weekの成果として、KSPを使ったビルドができるようになり、ビルド時間も短縮できることを確認できました。
導入方法
KSPのquickstartには色々書いてありますが、MoshiやRoomなどのライブラリを使うために使っていたkaptからKSPに移行する場合は、使いたいモジュールのbuild.gradle.ktsを以下のようにするだけで大丈夫そうです。
(前回はquickstartに書いてある自分でannotationを作る際の依存の設定と混同してうまく行かずに悩んでいました…)
plugins {
id("com.android.library")
kotlin("android")
// kotlin("kapt")
id("com.google.devtools.ksp") version "1.6.10-1.0.2" // kaptの依存を削除し、kspを追加する
}
dependencies {
// kapt("com.squareup.moshi:moshi-kotlin-codegen:1.13.0")
ksp("com.squareup.moshi:moshi-kotlin-codegen:1.13.0") // kaptをやめてkspに置き換える
}
ビルド時間の比較
今回はMoshiを使うためだけにkaptを利用していたモジュールを対象に、kaptからKSPに移行した場合のモジュール単体のビルド時間の変化を調査しました。
ローカルビルドで何回か試しただけの計測なので正確なものとは言えませんが、
kapt利用時は関連のタスクが0.8s + 0.7s = 1.5sかかっていたのに比べ、KSPでは0.5sで済むようになったという結果が見られました。
現在REALITYではMoshi + kaptを使っているモジュールは20個ありました。
モジュール単体で1秒程度の差が出ているので、単純計算で全てのモジュールに対応して20秒ビルド時間を短縮できたとすると、3分程度かかっているローカルでのクリーンビルドが10%程度削減の削減が見込めることとなります。
(これは大雑把な推測であり、後述の理由からまだ実際にはソースコードにマージできていないので、マージされたら実際に効果を計測していきたいです。)
問題点
MoshiはKSPをバージョン1.13.0から公式にサポートするようになりました。
一方でREALITY固有の問題かわかりませんが、Android Gradle Plugin(AGP)バージョン7.0.4とMoshi バージョン1.13.0の相性が悪いらしくビルドで問題が発生するのでMoshiのバージョンは1.12.0を利用しています。この問題はAGP 7.2.0にすると発生しなくなるようなのですが、まだstableではないためバージョンアップを見合わせています。
AGP 7.2.0がstableになれば上記の問題が解決してKSPへの移行を進めていけると考えています。
また、kaptを利用するライブラリであるRoomにはこのような記述があり、ライブラリによってはkaptとKSPが併存するとビルド時間の改善にはつながらない場合があるようです。
したがってkaptを使うのをやめつつKSPに移行していくのが良いと思います。
REALITYではDataBindingがまだ多くのモジュールで使われていますが、KSPの対応ライブラリの中にDataBindingがありません。
なので、KSPへの移行した効果を最大限発揮するにはkaptを使うのをやめる必要があり、そのためにはDataBindingからViewBindingやComposeを使うようにしていく必要があることが改めてわかりました。
最後に
REALITYでは日々の施策開発だけではなく、開発環境の改善にも業務として時間をとって取り組める環境があります。一緒にREALITYを作ってみたいなと思うエンジニアの方は下記リンクよりご応募ください。