先日時間がなくてできていなかったKotlin2.x系へのアップデートをしたのですが、ローカルビルドやCIがよく失敗するようになりました。
安定したビルドに戻すまでに行なった対応を残しておきます。
Kotlinのバージョンは以下のようにアップデートしました。
移行前:1.8.21
移行後:2.1.20
参考にしたのは主に以下の動画からです。
原因
推測の域を出ていませんが、おそらくkaptが残ったまま2.xに移行したためです。
上記参考動画でも言及されていますが、kaptが残ったままだとビルドプロセスが複雑になり、コンパイル速度が速くなるどころか、従来よりも遅くなる可能性があります。
kaptはXMLビューでデータバインディングを使用していると消すことができないため、ビューバインディングか、Jetpack Composeに書き直してkaptを消してkspへの移行が必要になります。
今回移行したこちらのプロジェクトではデータバインディングを使用しているXMLビューがまだ残っていました。
「まあ大丈夫だろう」と思って移行したのが失敗でしたね...
対策
ローカルビルドでは時々失敗する程度でしたが、Github Actionsを使用したCIはほぼ毎回失敗するようになっていました。
その際のエラー文言で以下のように書いてありました。
Not enough memory to run compilation. Try to increase it via 'gradle.properties':
kotlin.daemon.jvmargs=-Xmx<size>
どうやらメモリ不足でDaemonプロセスが終了していたようです。
以下を参考にgradle.propertiesを見直しました。
具体的には以下のように直しています。
# before
org.gradle.jvmargs=-Xmx1536m
# after
org.gradle.jvmargs=-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParallelGC -XX:MaxMetaspaceSize=1024m
元々のヒープメモリサイズが小さかったので少し増やしたのと、ガベージコレクションを並列スレッドで行うオプションを追加しました。
ローカルビルドもCIも失敗しなくなり、むしろ速くなったと思います。
おまけ
上記のエラーの他に、Jetpack Composeで構成している画面が一部描画されなくなる事象が起きました。
これは、MutableListをそのままビューに渡している部分があり、Strong Skipping Modeが再composeをうまく抑制していたためでした。
// ViewModel側で定義
val hogeLists = mutableListOf()
// View側
LazyColumn {
viewModel.hogeLists.forEach {...}
}
元々の書き方が良くないと言えばそうなのですが、Strong Skipping Modeの実装によりUIの描画のされ方も変わってくるので、バージョンアップした際はコードだけでなくUIも見直した方が良いかもしれません。