備忘録です。
最近、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
タブを開き、
以下の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引数を指定してメモリ足らなくなるのを防いでます。
というわけで無事にビルドできました。