0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

kaptが残ったままKotlin2.xに移行したらビルドが通らなくなった

Posted at

先日時間がなくてできていなかった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を見直しました。

具体的には以下のように直しています。

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も見直した方が良いかもしれません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?