AIR のネイティブ拡張を利用することにした場合、ActionScript のデバッグは AIR の SDK を使って行えますが、ネイティブコードのデバッグはネイティブのツールを利用することになるでしょう。
iOS 用の ANE を XCode を使ってデバッグする方法が公開されていましたので、その内容をご紹介します。元のブログ記事はこちらです。 (Debugging Native Extensions for AIR iOS)
---- ここから ----
ANE を含む IPA を ADT で生成する際、IPA と同じディレクトリに dSYM ファイルが生成されます。dSYM ファイルの名前は、アプリケーションバンドル名に .dSYM を付けたものになります。(アプリ名が MyApp.app ならば、MyApp.app.dSYM)
dSYM リソースは、ネイティブの iOS アプリのクラッシュログの解析で使われます。この記事 (Symbolicating iPhone App Crash Reports) には、クラッシュログの分析方法がいくつか議論されています。
さて、ANE のデバッグをする際、ジェイルブレイク無しで、XCode の外で gdb から iOS デバイス上のアプリを起動する方法は無いようです。ジェイルブレイクは、多くの人にとって望ましい手段ではないでしょうから、XCode から AIR アプリを起動しなければなりません。
そのため、XCode プロジェクト内でダミーのターゲットを作成し、AIR のアプリケーションをそこから起動できるように構成をします。
作業を始める前に、重要な注意項目があります。
AIR 3.1 では、ANE からの例外をサポートしません。どのような例外もキャッチされず、さらに、アプリをクラッシュさせることでしょう。
そこで、ANE のデバッグを行う際は、例外をコード内で使わないだけではなく、プロジェクト設定から C++ と Objective-C++ の例外を全て無効にします。
もし、この手順を正しく行わなければ、以下のような状況が起こります。
- 設定したブレークポイントを無視されることがある
- デバッガ内に表示される変数の値に怪しいものが混じる
- 次のようなメッセージがしばしば表示される “Error from Debugger: Previous frame inner to this frame (gdb could not unwind past this frame)”
それでは、以下が iOS 用の ANE をデバッグする手順です。
- ANE 用の XCode プロジェクトを開き、新しいターゲットとして "Empty Application" を追加する
- 追加したターゲットのビルド設定の画面を開き、"product name" にアプリ名を記述する (アプリケーション記述子の <filename> タグに指定したもの)
- ターゲットのビルドフェーズに、新しく "Run Script" を追加。その際、他のビルドフェーズは全て削除する
- 追加したビルドフェーズに以下のスクリプトを足す。このスクリプトが実行されると、XCode から起動可能な状態に IPA のコンテンツが展開される
# ディレクトリの変更 pushd ~/testproject/build # IPAのパッケージ、既にパッケージ済みの場合ここはスキップ adt -package -target ipa-debug-interpreter -provisioning-profile ~/certs/MyProfile.mobileprovision -storetype pkcs12 -keystore ~/certs/Certificates.p12 -storepass XXX AnotherApp.ipa Main-app.xml Main.swf -extdir ext # IPAを展開 cp AnotherApp.ipa AnotherApp.ipa.zip unzip -o AnotherApp.ipa.zip rm AnotherApp.ipa.zip # IPAに含まれていたコンテンツをXCode用にコピー cp -r Payload/AnotherApp.app/* "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/" cp -r AnotherApp.app.dSYM "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/" # 余分なファイルやフォルダを削除 rm "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/_CodeSignature/CodeResources" rmdir "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/_CodeSignature" rm "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/CodeResources" rm "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/PkgInfo" # 元のディレクトリに復帰 popd
- パス名やファイル名など、スクリプト中にイタリックで書かれた箇所を、実際の環境に合わせて修正する。スクリプト内では、adt コマンドを使って IPA をパッケージしているので、Flash Pro 等を使ってパッケージする場合は、該当箇所をスキップする
以上で設定は完了です。ターゲットをビルドしてデバッグを開始してみて下さい。通常、ビルドステップを実行すると、アプリケーションファイルは、プロジェクトディレクトリの中の build/Debug-iphoneos に展開されます。
---- ここまで ----
コメントする