【解決済】cordovaを使用してのビルド時にデーモンプロセスエラーが発生する【AndroidStudio利用】

superK

ユーザー
MVを使用してRPGを作成したのですが、公式の方法で環境設定を行っても.apkにビルドできないことが判明したため
Qiitaにございますこちらの投稿
を元にcordovaの環境設定をしてビルドを試みました。
しかしコマンドプロンプト上で
cordova requirements(ビルド事前チェック)
を行ってエラーが出ないにも関わらず、実際にビルドを実行しますと
以下のエラーログが表示されます。
cordova build android 実行時ログ

>Checking Java JDK and Android SDK versions
>ANDROID_SDK_ROOT=undefined (recommended setting)
>ANDROID_HOME=undefined (DEPRECATED)
>Using Android SDK: C:\Users\Username\AppData\Local\Android\Sdk
>Starting a Gradle Daemon (subsequent builds will be faster)

>FAILURE: Build failed with an exception.

>* What went wrong:
>Unable to start the daemon process.
>This problem might be caused by incorrect configuration of the daemon.
>For example, an unrecognized jvm option is used.
>Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/6.6.1/userguide/gradle_daemon.html
>Process command line: C:\Users\Username\AppData\Local\Programs\Java\jdk1.8.0_261\bin\java.exe -Xmx2048m -Dfile.encoding=windows-31j -Duser.country=JP >-Duser.language=ja -Duser.variant -cp C:\Users\Username\AppData\Local\Programs\gradle-6.6.1\lib\gradle-launcher-6.6.1.jar >org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.6.1
>Please read the following process output to find out more:
>-----------------------
>Error occurred during initialization of VM
>Could not reserve enough space for 2097152KB object heap

上記エラー内容で検索し
こちらに紹介されている方法を色々試してみたのですが
エラー内容が変わりません。
(一応AndroidStudio内の設定で
 Android Compillers の Maximum heap size は 700MB に
ProGuard の VM options: 欄に -Xmx512m を追記しています)

どなたか解決策をご享受願えませんでしょうか。

当方の環境は以下のとおりです。

java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) Client VM (build 25.261-b12, mixed mode, sharing)

Android Studio 4.0.1
Android Debug Bridge version 1.0.41
Version 30.0.4-6686687

Cordova -version
10.0.0

またPCのスペックは
OS:win10 home edition
プロセッサ:Intel(R)core(TM)i3 CPU M 380 @ 2.53GHz 2.53GHz
実装RAM:4.00GB
となっております。
(かなり低いですが、これが原因でしょうか)

長文失礼いたしました。
よろしくお願いいたします。
 

fspace

ユーザー
Androidもcordovaもあまり詳しくないのでエラーメッセージの内容だけいくらか。

まず、
Could not reserve enough space for 2097152KB object heap
2097152KBのオブジェクトヒープのための十分なスペースが確保できませんでした
とあるので、原因はメモリ不足だと思われます(ヒープはプログラムが使うメモリ領域の一種です)。

2097152 KB = 2048 x 1024 KB = 2048 MB で、この数字がどこからきたかというと、
Process command line: C:\Users\Username\AppData\Local\Programs\Java\jdk1.8.0_261\bin\java.exe -Xmx2048m -Dfile.encoding=windows-31j -Duser.country=JP >-Duser.language=ja -Duser.variant -cp C:\Users\Username\AppData\Local\Programs\gradle-6.6.1\lib\gradle-launcher-6.6.1.jar
-Xmx2048mの部分だと思います。-Xmxまでがヒープメモリの容量を指定するという意味で、2048mが2048MBの容量で、という意味です。

つまり、2048MB(=2GB)の容量でメモリを確保するように言われたけど、確保しようとしたら十分なスペースがもらえなかったよ、ということになります。

リンクとして貼られていたサイトで紹介されているのは、(おそらく)このヒープメモリの容量指定を小さく変更するための方法で、もしこれらを設定してもうまく動かないということであれば、他のプログラムにメモリをとられ過ぎていて、メモリが足りていないのだと思います。

ただ、リンク先のサイトは海外の有名な質問サイトStack Overflowの(おそらく)機械翻訳で、翻訳の質が高くありません(最初の回答でも不要な"&"が設定の一部のように含まれてしまっています)。元のページと最初の回答の翻訳を書いておくので、もう一度確かめてみることをおすすめします。


The Solution Worked:
  1. Open the projects gradle.properties file in android studio
  2. Added this line at end of file org.gradle.jvmargs=-Xmx1024m & Save the file
  3. Close & reopen the project
この方法でいけたよ:
  1. Android Studio 内のプロジェクトの gradle.properties ファイルを開く
  2. ファイルの最後に org.gradle.jvmargs=-Xmx1024m という行を追記して、ファイルを保存する
  3. プロジェクトを閉じて、再度開く
 

superK

ユーザー
fspace様、ご返信いただき誠にありがとうございます。
また、こちらからのお返事が大変遅くなり、申し訳ございません。
やはりメモリ不足とのこと、ご指摘いただきありがとうございます。

いただきました内容を踏まえ、AndroidStudioの設定を以下のように変更しました。
1.Gradle Scripts>gradle.properties の最終行に org.gradle.jvmargs=-Xmx512m を追記
2.Gradle Scripts>local.properties の最終行に org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 を追記
加えて前回の設定時と同様に
Android Compillers の Maximum heap size は 700MB に、ProGuard の VM options: 欄に -Xmx512m を追記しています。

この状態で再度cmdよりビルドを試みたのですが
表示されるエラーは前回と変わらず

cordova build android

Checking Java JDK and Android SDK versions
ANDROID_SDK_ROOT=undefined (recommended setting)
ANDROID_HOME=undefined (DEPRECATED)
Using Android SDK: C:\Users\Username\AppData\Local\Android\Sdk
Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

* What went wrong:
Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/6.6.1/userguide/gradle_daemon.html
Process command line: C:\Users\Username\AppData\Local\Programs\Java\jdk1.8.0_261\bin\java.exe -Xmx2048m -Dfile.encoding=windows-31j -Duser.country=JP -Duser.language=ja -Duser.variant -cp C:\Users\Username\AppData\Local\Programs\gradle-6.6.1\lib\gradle-launcher-6.6.1.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.6.1
Please read the following process output to find out more:
-----------------------
Error occurred during initialization of VM
Could not reserve enough space for 2097152KB object heap

と表示されました。
ビルド実行時には念のためブラウザも切り、タスクマネージャー上ではcdmのみ動作している環境にしました。
問題の部分
-Xmx2048m
が残ったままになっているため、おそらくAndroidStudio内の上記設定変更が反映されていないか、それ以外のプログラム(java?)でメモリの負荷が高い状態のままになっているのかと存じます。
引き続き原因を調べてまいりますが、経過報告としては以上となります。

よろしくお願いいたします。
 

KurotsuShirou

ユーザー
お疲れさまです。
ちょっと質問に質問のような回答になりますが、

Gradle6.6.1(最新版にアップデートしても大丈夫です。ダウンロードも出来ます。最新版は6.7)
のインストールされている階層が深いようですが、
Gradleのインストール階層をC直下に移動できますか?

パスを通し直さなければなりませんが、

C:¥gradle-6.7¥bin

などのようにしてしまって、AndroidStudioとAndroidSDKとGradleの依存関係を分離して、AndroidStudioを起動しなくても良いように環境設定をしてあげれば、ロースペック(大変すみませんが)端末でもapkファイルを生成できるはずです。

伏せてるところは各端末のユーザー名が違うためです。

以上のような方法で解決しませんでしょうか。
 

Attachments

superK

ユーザー
KurotsuShirou様、ご教授頂きまして誠にありがとうございます。
早速以下の手順で試させていただきました。

1.最新版であるGradle6.7をDL後、\C直下に移動
2.システム環境変数設定にて新パス「GRADLE_HOME」「C:\gradle-6.7」を設定(旧GRADLE_HOMEは削除)
3.cdm管理者起動から「cordova build android」を実行

その際のログが以下となります。

Checking Java JDK and Android SDK versions
ANDROID_SDK_ROOT=undefined (recommended setting)
ANDROID_HOME=undefined (DEPRECATED)
Using Android SDK: C:\Users\Username\AppData\Local\Android\Sdk

Welcome to Gradle 6.7!

Here are the highlights of this release:
- File system watching is ready for production use
- Declare the version of Java your build requires
- Java 15 support

For more details see https://docs.gradle.org/6.7/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

* What went wrong:
Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
For example, an unrecognized jvm option is used.
Please refer to the User Manual chapter on the daemon at https://docs.gradle.org/6.7/userguide/gradle_daemon.html
Process command line: C:\Users\Username\AppData\Local\Programs\Java\jdk1.8.0_261\bin\java.exe -Xmx2048m -Dfile.encoding=windows-31j -Duser.country=JP -Duser.language=ja -Duser.variant -cp C:\gradle-6.7\lib\gradle-launcher-6.7.jar org.gradle.launcher.daemon.bootstrap.GradleDaemon 6.7
Please read the following process output to find out more:
-----------------------
Error occurred during initialization of VM
Could not reserve enough space for 2097152KB object heap

Gradle 6.7の起動には成功しましたが、過去と同様に
\Programs\Java\jdk1.8.0_261\bin\java.exe -Xmx2048m
の部分で同様のエラーが出てメモリ不足のようです。

Javaの設定に原因がありそうですので、今後はそこを調整できないか調べてまいります。

よろしくお願いいたします。
 

fspace

ユーザー
ダメでしたか……。

ところで、少し気になっていたのですが、

2.Gradle Scripts>local.properties の最終行に org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 を追記
というのはどこから来たのでしょうか。

同じ内容が二度書かれているのも変ですし、少し調べたところ-XX:MaxPermSizeはJava 8以降使用されていないようです。また、Android Studioのドキュメントを見る限りでは、local.propertiesはSDKやCMakeのパスを指定するのに使うもののように思えます(自分はGradleもAndroid Studioのビルドスクリプトもよく知らないので見当違いな指摘だったらすみません)。

あと、嫌でなければ superK さんがプログラムに対してどの程度知識を持っているのか教えてもらえますか。それなりの知識があるのであれば、門外漢の自分がごちゃごちゃ言っても手を煩わせるだけでしょうし、逆にほとんど知識がないのであれば、初歩的なミスも考えなければならないので。
 

superK

ユーザー
fspace様、ご返信頂きありがとうございます。

すみません、先の私の書き込み
>2.Gradle Scripts>local.properties の最終行に org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 を追記
こちらはフォーラムに書き込む際のコピペミスでした。
先ほどAndroidStudio内のlocal.properties を確認したところ
最終行は
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
となっておりました。

しかし、ご指摘いただきましたとおり
local.properties ではなく gradle.properties に記載せねばなりませんでした。
これは先に述べました
こちらに紹介されている解決策の1つです。
(しかし、どちらにせよ古い内容となるのですね。ご教授いただきありがとうございます)

また、自分のプログラミングの知識はほぼ無く
html5
Javascript
の入門書をいくつかこなした程度となります。
恥ずかしながら環境設定やパスを通す作業もapkビルドの段階で初めて行いました。

初歩的なミスございましたらご指摘頂けますと幸いです。
こちらは引き続きエラーと向かい合ってまいります。

よろしくお願いいたします。
 

superK

ユーザー
【解決済】
こちら解決いたしました。


このページにございます解決方法
GradlePropertiesParser.js 内の37行目

'org.gradle.jvmargs': '-Xmx2048m',

2048⇒512 に書き換えたところ
ビルドが成功いたしました。

以下、その際のログになります。


cordova build android 実行


Checking Java JDK and Android SDK versions
ANDROID_SDK_ROOT=undefined (recommended setting)
ANDROID_HOME=undefined (DEPRECATED)
Using Android SDK: C:\Users\Username\AppData\Local\Android\Sdk
Starting a Gradle Daemon (subsequent builds will be faster)

BUILD SUCCESSFUL in 57s

1 actionable task: 1 executed
Subproject Path: CordovaLib
Subproject Path: app
Downloading https://services.gradle.org/distributions/gradle-6.5-all.zip
.............10%..............20%..............30%..............40%..............50%..............60%..............70%..............80%..............90%..............100%

Welcome to Gradle 6.5!

Here are the highlights of this release:
- Experimental file-system watching
- Improved version ordering
- New samples

For more details see https://docs.gradle.org/6.5/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.5/userguide/command_line_interface.html#sec:command_line_warnings

BUILD SUCCESSFUL in 8m 32s

40 actionable tasks: 40 executed
Built the following apk(s):
C:\Users\Username\AppData\Local\Programs\gamename\platforms\android\app\build\outputs\apk\debug\app-debug.apk


こちら使用メモリ量が2048で固定になっていたことが原因だったようです。
(ビルドしたapkがAndroidスマホ上で動作することも確認しました)

fspace様、KurotsuShirou様
こちらからの質問に丁寧にお答えいただき、ありがとうございました。

低スペックPCのみに起こる現象のため、あまり起こりうる問題とは言えませんが
こちらのやり取りが将来どなたかの解決の糸口になれば幸いです。

よろしくお願いいたします。
 

fspace

ユーザー
解決したようでなによりです。

ちょっと気になったので原因を少し追ってみたんですが、どうも cordova-android のバグっぽい感じがしますね。件の書き換え箇所はデフォルト値の設定なので、本来設定値が存在しない場合にのみ適用されるべきものなのですが、これが gradle.properties の値を書き換えて適用されてしまっているようです。

変更履歴を追ってみたところ、元々次の流れだったのが、

1. gradle.propertiesの設定の読み込み
2. 存在しない設定値をデフォルト値で埋める

cordovaからも設定を追加できるようにということでなぜか次のように変化して、

1. gradle.propertiesの設定の読み込み
2. 存在しない設定値をデフォルト値で埋める
3. 存在しない設定値をcordovaの設定値で埋める

このままではcordovaの設定値の多くが無視されてしまうということで、

1. gradle.propertiesの設定の読み込み
2. デフォルト値で設定を上書き
3. cordovaの設定値で設定を上書き

と書き換えられてしまったみたいです。
 

superK

ユーザー
fspace様

原因をご解説頂き、ありがとうございます。
それでAndroidStudioを介した設定がずっと反映されなかったのですね。
しかしあえて低メモリのPCで動かさないと分からないバグなので
発見・修正が遅れているのかもしれません。
どちらにせよ、現状の設定のままビルド⇒デバッグを重ねて
最終的にはGooglePlayStoreでリリースできるまで頑張ります。
よろしくお願いいたします。
 
トップ