AppSeedのアプリ開発ブログ

アプリ開発会社AppSeed(アップシード)開発担当のブログです。iOS、Android、Unity、Cocos2d-xなどアプリ開発関連のTipsや備忘録、アプリ開発に役立つ情報を発信します。

【Cocos2d-x】ターミナルでコマンドビルドする際、リリースビルドがエラーになる時の対処法

https://nzigen.com/ysawa/wp-content/uploads/2016/05/800x480_2dx_landscape.png

Cocos2d-xでコマンドビルドする際、リリースビルドでエラーになる場合の対処法について。

ここ2、3日ずっとハマっていた問題がようやく解決しました。

今後のために記録として残しておきたいと思います。



エラー状況


・Cocos2d-xのプロジェクトは他の人が作ったプロジェクト

Android Studioでビルドしようとしたけど、gradleエラーやAndroid Studioのバージョンエラーなどが多発したので、ターミナルでコマンドビルドすることにした

・環境依存と思われるエラーを解消して、とりあえずデバッグビルドは成功

・リリースビルドをしようとすると「generateJsonModelRelease」でエラーが発生しビルド失敗する

って感じです


ビルドコマンドは以下

cocos run -s "プロジェクトパス" --proj-dir "プロジェクトディレクトリパス" -p android -m release


エラー内容は以下


> Task ::generateJsonModelRelease FAILED


Starting process 'command '/Applications/adt-bundle-mac-x86_64-20140702/android-ndk-r16b/ndk-build''. Working directory: /Users/Downloads/Android/proj.android-studio/app Command: /Applications/adt-bundle-mac-x86_64-20140702/android-ndk-r16b/ndk-build NDK_PROJECT_PATH=null APP_BUILD_SCRIPT=/Users/Downloads/NPK-2018-08-10-Android/proj.android-studio/app/jni/Android.mk NDK_APPLICATION_MK=/Users/Downloads/Android/proj.android-studio/app/jni/Application.mk APP_ABI=armeabi-v7a NDK_ALL_ABIS=armeabi-v7a NDK_DEBUG=0 APP_PLATFORM=android-14 NDK_OUT=/Users/Downloads/Android/proj.android-studio/app/build/intermediates/ndkBuild/release/obj NDK_LIBS_OUT=/Users/kijimayouhei/Downloads/NPK-2018-08-10-Android/proj.android-studio/app/build/intermediates/ndkBuild/release/lib NDK_TOOLCHAIN_VERSION=4.9 APP_PLATFORM=android-10 NDK_MODULE_PATH=/Users/Downloads/Android/cocos2d:/Users/Downloads/NPK-2018-08-10-Android/cocos2d/cocos:/Users/Downloads/NPK-2018-08-10-Android/cocos2d/external -j4 NDK_DEBUG=0 APP_SHORT_COMMANDS=false LOCAL_SHORT_COMMANDS=false -B -n
Successfully started process 'command '/Applications/adt-bundle-mac-x86_64-20140702/android-ndk-r16b/ndk-build''
/Users/Downloads/NPK-2018-08-10-Android/proj.android-studio/app/build/intermediates/ndkBuild/release/obj/local/armeabi-v7a/objs/audioengine_static/AssetFd.o.d:1: *** target pattern contains no `%'.  Stop.
External native generate JSON release: JSON generation completed with problems

:NPK:generateJsonModelRelease (Thread[Daemon worker Thread 4,5,main]) completed. Took 0.976 secs.

FAILURE: Build failed with an exception.


上記のエラーが出るのは、リリースビルドの時のみで、デバッグビルドの場合、ワーニングは出ますがエラーは発生しません。

> Task ::generateJsonModelDebug UP-TO-DATE
Putting task artifact state for task '::generateJsonModelDebug' into context took 0.0 secs.
Skipping task '::generateJsonModelDebug' as it is up-to-date (took 0.0 secs).

::generateJsonModelDebug (Thread[Task worker for ':',5,main]) completed. Took 0.0 secs.
::externalNativeBuildDebug (Thread[Task worker for ':',5,main]) started.


なんでリリースビルドだけエラーが出るのかが謎なんですが、他の人からもらったプロジェクトなので、環境設定周りに原因があるはず。
ただ一通り確認したんですが結局わからず。。



リリースビルドがエラーになる場合の対処法


最終的に解決しました。
参考になったのは以下の記事です↓

qiita.com

なんかファイルが残ってい未定なので、以下のファイルを消してやります。

proj.android/libs/armeabi
proj.android/obj
これで、もう一度、./build_native.shすれば、できるはず!


上記の場合は「build_native.sh」を使う方法ですが、objファイル的なものを削除すると、ビルドで生成されたものが再構築されるっていうことがわかりました。



上記を参考に、ビルド時に生成されると思われるファイルを探したところ、

f:id:no-work-no-life-4081:20180914094647p:plain

proj.android-studio/app/build/intermediates/ndkBuild/release/obj

上記あたりが怪しいと思ったので、release以下を全て削除。

そして再度ビルドして見たところ、無事リリースビルドが成功しました。

BUILD SUCCESSFUL in 15s
81 actionable tasks: 1 executed, 80 up-to-date
Move apk to /Users/Downloads/Android/bin/release/android
Build succeed.


おそらく、前にプロジェクトを作成した人のリリースビルド関連のファイルが残っていたため、そのファイルを元にビルドしているからビルドエラーが発生していたと思われます。

proj.android-studio/app/build/intermediates/ndkBuild/release/obj

ndkのobjを削除すると、ビルド時に生成されたファイルが再生成されるのでビルド成功したということだと思います。

とりあえずよかったです。


Cocos2d-xってやっぱり環境設定が厄介ですね。。