LoginSignup
20
20

More than 5 years have passed since last update.

cocos2d-x 3.0でandroidのビルドをする時に、常にデバッグフラグが立ってしまう問題

Posted at

cocos2d-x 3.0で cocos run -p android -m release を使ってandroidのリリースビルドをしても、
COCOS2D_DEBUG フラグが立ってしまっています。
このフラグが立っていると、ログ出力やassertなどが無効化されません。

原因

proj.android/jni/Application.mk が以下のようになっているためです。

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 が以下のように変更します。

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 runndk-build を呼ぶ時に、
デバッグビルドの時は NDK_DEBUG=1 を付加して呼んでいるためです。

そのため Application.mk ファイルで場合分けすれば、デバッグフラグを自動的に調整できます。

ライブラリファイルが更新されない問題

以上の方法を実行すればデバッグビルドとリリースビルドでデバッグフラグを自動的に調整できますが、 1つ大きな問題があります。
それは、ndk-buildがライブラリファイルである *.a*.so ファイルの出力先を
デバッグビルドとリリースビルドで共用しているため、
オブジェクトファイルである *.o の作り分けができても、ライブラリファイルの更新が上手くいかない可能性があります。

例えば、Application.mk ファイルを変更した状態で

  1. デバッグビルド
  2. リリースビルド
  3. デバッグビルド

を順に実行すると、最後のデバッグビルドの時は変更がないため *.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 ファイルを以下のように書き換えます。

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)

()

これで全自動でデバッグビルドとリリースビルドを分けられるようになりました。
これがバグとしていつか修正されるといいですね。
またもっとスマートな方法を知っている方がいらしゃれば、ぜひ教えて下さい。

20
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
20