× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
cocos2d-xですでに作っているプロジェクトの
cocos2d-xのバージョンアップをするのは、少し手がかかる 特に、3.7より古いバージョンで作ったゲームを 3.7移行で対応されたandroid-studioに対応したい時はどうするのか。 通常、cocosプロジェクトのルートに 各プラットフォーム向けのディレクトリがある proj.ios_mac proj.android などなど。 これらは、最初にプロジェクトを作る時に $ cocos2d-x-3.7/setup.py を実行することで作られる。 後からこれを実行することはできない(できるかもしれないがどうなるかわからない) 1. cocos2d-x-3.7/templates/cpp-template-default/proj.android-studio/ ディレクトリを、自分のプロジェクトにまるっとコピー 2. AndroidManifest.xmlを、 proj.android/からまるっとコピー 3. とりあえずコンパイルしてみる $ cd PROJ_DIR/proj.android-studio $ cocos compile -p android --android-studio エラーが出る。
4. build.gradleのapplicationIdがデフォルトのままなので AndroidManifest.xmlのpackageと同じ名前に変更 ついでに、defaultConfig 関連の設定を全部proj.androidと同じに揃える(sdkVersionなど) 5. 再度コンパイル。 先ほどのエラーはなくなった 次のエラーは
cocos2d-xのライブラリのインクルード指定をする必要がある 6. Android.mkのcocosライブラリインクルード周りを見てみる。 が、デフォルトでextension周りはインクルードされているようだ。 ついでなので、
を記述。 またApplication.mkに
を記述 7. コンパイル。 まだ同じところでエラー。 8. インクルードパスを指定するような場所を探す。 とりあえずProject StructureでNDKパスを以下に指定 /path/to/android/SDK/ndk-bundle SDKは /path/to/android/SDK JDKは /Library/Java/JavaVirtualMachines/jdk1.8.0_73.jdk/Contents/Home しかしそのほかにインクルードパスを指定するようなところがない インクルードパスを指定というより、 そのソースを含むlibcocos2dxライブラリの登録が必要なのか 9. 通常の手順で作られたcocos2dx用のandroid-studioプロジェクトには、libcocos2dxモジュールがプロジェクトビューに表示されている。 これは、 GAME_DIR/cocos2d/cocos/platform/android/libcocos2dx ディレクトリである。 これを追加してみる。 cocos2d-x-3.7で作ったことのあるcocos2d-xプロジェクトから、 GAME_DIR/cocos2d/cocos/platform/androidディレクトリをまるっと上書きコピー その上で、libcocos2dxを追加する …と、ここまで来て プロジェクトにモジュールを追加できなかった(追加するとき、libcocos2dxをプロジェクトとして追加してしまったようだ) プロジェクト構成がおかしくなり、プロジェクトやディレクトリそのものを削除して再作成しても治らなくなった そこで、結局新しいディレクトリでcocosプロジェクトごと新たに作ることにした $ cocos new PROJ_NAME -p PACKAGE_NAME -l cpp 元のproj.androidから、新しいproj.android-studioにコピーするもの Classes/ Resources/ proj.android/AndroidManifest.xml proj.android/jni/ proj.android/app/src/ proj.android/libs/ ここまでコピーしたら、一度コンパイルしてみる $ cocos compile -p android --android-studio また、androidStudioだと、c++のスタティックライブラリにstring系が含まれていないので、 その対応も行う 参考 その他にやること 各種ライブラリをコピー Analyticsに関して、 app_tracker.xml EasyTrackerをAnalyticsApplicationに変更 など PR |
一応、BuildVariantsで選択してから通常通りビルドできる
が、なぜか上手くいかない。 リリースビルドをSignedでないAPKで作成することになるので、エラーになる リリースモードは、SignedAPKを作成するのが良い。 Signedについては、build.gradle内に記述できる。 Project Structureにも、Signedタブがある(同じ) C++の部分については、jni/Application.mkに記述できる
ここで、NDK_DEBUG の値は build.gradleの
で決まる。 なお、C++部分の定義なので、AndroidStudioからのビルドだけでなく、 $ cocos compile -p android --android-studio --ndk-mode release が必要なことに注意 |
プロジェクト(正確にはソースディレクトリ)を指定する(-s)
$ cocos compile -s path/to/project -p android --android-studio NDKをリリースモードでビルドする(--ndk-mode) $ cocos compile -p android --android-studio --ndk-mode release コンパイルをデバッグモードで行う(ログがたくさん出るのか?)(--debug) $ cocos compile -p android --android-studio --debug ヘルプ $ cocos compile --help (cocos --help ではない) |
接続しているデバイスのログ出力
$ adb logcat 自分のゲームのログだけを出力 $ adb logcat | grep System 接続しているデバイスのファイラ $ adb shell $ run-as パッケージ名 接続しているデバイスにapkをインストール $ adb install XXX.apk 接続しているデバイスのapkを削除 $adb uninstall xxx.xxx.xxx.packagename Macに接続しているデバイスの情報を取得 $ adb devices |
方法はある。
Qiita Experimental Plugin というgradleの新プラグインを使う 公式 だが、gradleの書き方自体が変わったり、対応するgradleのバージョンが限られたりと いろいろ制限付き。 ちょっとやってみたが、見たことないエラーが起きたので 一旦必要になるまで見送り。 バージョンもどんどん上がり、これらのページに書いてあるのとは状況が変わっている。 いつになったら正式に組み込まれるのか。 |
参考ページ build.gradleへの記述でビルドを分けられる。 Build Types debug,releaseなどを指定できる 書き方例。上記ページから引用
Product Flavors ビルドレベルではなく、機能の違いなどを指定できる 書き方例。上記ページから引用
C++のようにマクロはないので、ソースの切り替えは2種類用意する。 app/src/flavor1/ app/src/flavor2/ のように、build.gradle に書いたflavor名のディレクトリ以下に配置したら、それが使用されるということらしい。(まだ試していない) Build TypesとProduct Flavorを合わせて Build Variants という。 どのBuild Variantsでビルドするかは、以下の場所で指定する。 結構気づきにくい |
Android公式ドキュメント
Proguard公式ドキュメント2 ProGuardがやること ・不要なコードの削除 ・変数名、クラス名を変更して、難読化する ・リリースモードでのみ動作 ・特に何もせずとも処理されるようになっている ・build.gradleに設定記述あり
minifyEnabled を true にすると、ProGuardが実行される proguardFiles getDefaultProguardFile('proguard-android.txt'), 行は、proguardの詳細設定が描いてあるファイル名を指定。 ANDROID_SDK_ROOT/tools/proguard/ 以下のファイル名を指定する。 proguard-android.txt の他に、最適化を含んだ設定ファイルとして proguard-android-optimize.txt というものも設定できるようだ。 ちなみに2つのファイルの差分は以下だけ proguard-android.txt(最適化なし)
proguard-android-optimize.txt(最適化あり)
多く書いてあるのは、メソッドを削除させないようにする設定。例えば
のようなもの。Javaコード上では使われていないが、xmlから呼び出すために必要なメソッド、のようなことらしい さて、build.gradleの記述に戻る 'proguard-rules.pro' と書いてある行があるが、これはプロジェクトディレクトリ内にあり、 プロジェクト固有の設定を書くファイル。(proはprojectのことのようだ) また、ProGuard処理をすると、 build/outs/mapping.txt というファイルが生成される。 これを使うと、難読化したスタックトレースを元に戻すことができる。 $ cd $ANDROID_SDK_ROOT/tools/proguard $ retrace.bat -verbose mapping.txt obfuscated_trace.txt さて、実際にやってみたところ、エラーが出た 調べると、結局proguard-rules.proに
と書けということになりそう。 詳しいページ これ見ると、JNIだといろいろ設定がいるとのこと。 おそらく、javaコード内から呼び出されることのない、Native_***()系メソッドを全部keep指定する必要があるということだろう。
という感じか?(試していないので合っているかはわからない) 処理にもものすごい時間が掛かる。 しばらくやらなくていいかなという気がしてくる |
・テクスチャの最大サイズは 2048x2048
なまじiOSだと動いちゃうので気づきにくい D/cocos2d-x debug info: cocos2d: WARNING: Image (2984 x 2042) is bigger than the supported 2048 x 2048 |
Xcodeだと、
CC_TARGET_OS_IPHONE というマクロが定義されているので、これを使用するのが良い。 #if defined CC_TARGET_OS_IPHONE Androidの場合、 app/jni/Application.mk に以下を記述する APP_CPPFLAGS += -DCC_TARGET_OS_ANDROID すると、こう書けるようになる #ifdef CC_TARGET_OS_ANDROID まとめると、
となる。 マクロでなく実行中に判定したい時は
という書き方もできる 以下、次善策 #if CC_TARGET_PLATFORM == CC_PLATFORM_IOS #elif CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID #endif このような感じで書く。 気をつけないといけないのは、 #include "Cocos2d.h" または #include "cocos/platform/CCPlatformConfig.h" をしていないファイルでこの記述を書いても正しく動作しないということ。 CC_TARGET_PLATFORMもCC_PLATFORM_IOSもどちらもundefinedだと、 等号自体は成り立ってしまうため だから #if defined(CC_TARGET_PLATFORM) && (CC_TARGET_PLATFORM == CC_PLATFORM_IOS) というような書き方であるべき |
|