BitriseでOutOfMemoryErrorが発生してビルドが失敗する場合

f:id:Keisuke69:20210302154651p:plain

備忘録です。

最近、React Nativeで作ったアプリをBitriseでビルドするのを試しています。

Bitrise - Mobile Continuous Integration and Delivery

このBitriseというプラットフォームはとても使いやすくて、ビルドのためのワークフローの定義も直感的にできました。

ところがAndroidのビルドに失敗してしまうんですよね。以下のような感じでOutOfMemoryErrorが出ています。

> Task :app:mergeExtDexDebug FAILED
D8: java.lang.OutOfMemoryError: Java heap space
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: 
    at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:132)
    at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:119)
    at com.android.build.gradle.internal.transforms.DexMergerTransformCallable.call(DexMergerTransformCallable.java:102)
    at com.android.build.gradle.internal.tasks.DexMergingTaskRunnable.run(DexMergingTask.kt:432)
    at com.android.build.gradle.internal.tasks.Workers$ActionFacade.run(Workers.kt:242)
  ...

というわけでヒープサイズを増やしたりしてみるなどします。

Workflow EditerのEnv Varsタブを開き、

f:id:Keisuke69:20210302153212p:plain

以下の2つをセットします。

GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"'
JAVA_OPTS: "-Xms512m -Xmx1024m"

ところが、これで解決かと思いきや自分の環境では別のエラーが出るようになってしまいました。

しかもこれまでOOMが発生していたStepとは別のStepです。OOMが発生していたStepより前のStepのInstall missing Android SDK componentsで以下のようなエラーが出ました。

Failed to ensure android components, error: output: Invalid initial heap size: -Xms512m -Xmx1024m
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
error: exit status 1

ヒープサイズ周りのエラーってことなので明らかに前の設定が影響してるんだと思います。ということで今度は先ほどの設定を削除してgradle.propertiesに以下の内容を追加します。

org.gradle.daemon=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8

これはgradleの実行環境をデーモン化するものです。通常はビルド時間短縮のために使ったりするオプションですね。加えて、org.gradle.jvmargsで実行時のJVM引数を指定してメモリ足らなくなるのを防いでます。

というわけで無事にビルドできました。

©Keisuke Nishitani, 2020   プライバシーポリシー