cocos2d-x 3.0で cocos run -p android -m release
を使ってandroidのリリースビルドをしても、
COCOS2D_DEBUG
フラグが立ってしまっています。
このフラグが立っていると、ログ出力やassertなどが無効化されません。
原因
proj.android/jni/Application.mk
が以下のようになっているためです。
APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
対処方法
ちょっとした問題を抱えた方法
proj.android/jni/Application.mk
が以下のように変更します。
APP_STL := gnustl_static
ifdef NDK_DEBUG
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char
else
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -std=c++11 -fsigned-char
endif
解説
これは、デフォルトで cocos run
が ndk-build
を呼ぶ時に、
デバッグビルドの時は NDK_DEBUG=1
を付加して呼んでいるためです。
そのため Application.mk
ファイルで場合分けすれば、デバッグフラグを自動的に調整できます。
ライブラリファイルが更新されない問題
以上の方法を実行すればデバッグビルドとリリースビルドでデバッグフラグを自動的に調整できますが、 1つ大きな問題があります。
それは、ndk-buildがライブラリファイルである *.a
や *.so
ファイルの出力先を
デバッグビルドとリリースビルドで共用しているため、
オブジェクトファイルである *.o
の作り分けができても、ライブラリファイルの更新が上手くいかない可能性があります。
例えば、Application.mk
ファイルを変更した状態で
- デバッグビルド
- リリースビルド
- デバッグビルド
を順に実行すると、最後のデバッグビルドの時は変更がないため *.o
ファイルが更新されず、
リリースビルドでできた最終生成物より日付が新しくならず、
ライブラリファイルが更新されません。
そのためデバッグビルドにも関わらず、実際にインストールされるのはリリースビルドのものになります。
ライブラリファイルを常に新規作成する方法
ビルド実行前に proj.android/obj/local/armeabi
にある *.a
ファイルを常に削除すれば、ライブラリファイルは常に新規作成されます。
ただし ndk-build clean
では、オブジェクトファイルまで消してしまいます。
そこでビルド実行前に
find proj.android/obj -name "*.a" | xargs rm -v
を実行してしまいましょう。
さらにちょっと荒っぽいですが、
cocos2d-xのpythonスクリプトを書き換えることで、削除コマンドを自動的に実行させます。
具体的には、cocos2d-xのソースフォルダ (not プロジェクトルート) にある
tools/cocos2d-console/plugins/project_compile/build_android.py
ファイルを以下のように書き換えます。
(略)
def do_ndk_build(self, ndk_root, ndk_build_param, build_mode):
select_toolchain_version(ndk_root)
app_android_root = self.app_android_root
cocos_root = self.cocos_root
ndk_path = os.path.join(ndk_root, "ndk-build")
module_paths = [os.path.join(app_android_root, path) for path in self.ndk_module_paths]
# delete *.a files
rm_cmd = 'find %s/obj -name "*.a" | xargs rm -v' % app_android_root
self._run_cmd(rm_cmd)
# windows should use ";" to seperate module paths
if cocos.os_is_win32():
ndk_module_path = ';'.join(module_paths)
else:
ndk_module_path = ':'.join(module_paths)
(略)
これで全自動でデバッグビルドとリリースビルドを分けられるようになりました。
これがバグとしていつか修正されるといいですね。
またもっとスマートな方法を知っている方がいらしゃれば、ぜひ教えて下さい。