dSYM を自動的にアップロードする | iOS | Flutter 3.29.0 | Crashlytics | Firebase

セルフプレジャー(マスターベーション)を記録&分析するアプリ『アイナーノ』の Ver.7.0.0 で「Firebase Crashlytics」に対応したのですが、その全容を把握できていなかった為、dSYM を自動的にアップロードする実行スクリプトを Xcode に組み込んでいませんでした。

リリース後、直ぐに Google (Firebase) から「dSYM の欠損」という警告メールが届き、手動で対応しました。その詳細は以下の記事です。

「dSYM の欠損」に対応する | iOS | Flutter 3.29.0 | Crashlytics | Firebase

しかし、アプリで発生したエラーが Crashlytics に登録される度に、この手動対応を行うのは非効率です。なので、Firebase が推奨する通りに、dSYM を自動的にアップロードする実行スクリプトを Xcode に組み込みました。

とにかく、公式ドキュメントが理解に苦しむ内容だったので、以下に補足したいと思います。

スタートガイドでは不十分

Firebase Crashlytics を使ってみる - Google
https://firebase.google.com/docs/crashlytics/get-started?hl=ja&platform=flutter

このスタートガイドを読んで『アイナーノ』に Crashlytics を導入したのですが、dSYM を自動的にアップロードする実行スクリプトについては不明瞭で、その必要性を理解できませんでした。

なので改めて、以下を一通り参照します。

Crashlytics ダッシュボードで読み取り可能なクラッシュ レポートを取得する - Firebase ドキュメント
https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?hl=ja&platform=flutter

dSYM ファイルのアップロードの構成を確認する - Firebase ドキュメント
https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?hl=ja&platform=flutter#apple-upload-dsym-script-configuration

dSYM の自動アップロード用の実行スクリプトが存在しない - Firebase ドキュメント
https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?hl=ja&platform=flutter#run-script-does-not-exist

Xcode の [Runner] [Build Phases] に新規作成する実行スクリプトのサンプルが掲載されています。dSYM を自動的にアップロードするには、この対応が必要だったのです。

[Input Files] に追加するパスも含めて、指示通りに全て対応します。

ところが、この状態で iPhone シミュレータを起動しようとすると、ビルドに失敗します。

ビルドが失敗する原因

さて、問題なのは、この実行スクリプトの内容はリリース ビルド用だという点です。

開発中のデバッグ ビルド(シミュレータの起動なども含む)では、以下のメッセージを出力してビルドが失敗します。

Unable to get file attributes for dSYM file at path "/Users/cutboss/Library/Developer/Xcode/DerivedData/Runner-guaqojlzlufgapivgpbratcmscml/Build/Products/Debug-iphonesimulator/App.framework.dSYM/Contents/Resources/DWARF"
Running upload-symbols in Build Phase mode
Validating build environment for Crashlytics...
Processing dSYMs...
Command PhaseScriptExecution failed with a nonzero exit code

App.framework.dSYM」というファイル名が実行スクリプトに記載されていますが、このファイルはリリース ビルドでしか生成されません。デバッグ ビルドで生成されるファイルは違っていて「Runner.app.dSYM」という名前なのです。

名前が違うので、当然、存在しないパスは、エラーになります。

デバッグ ビルドに対応した実行スクリプト

リリース ビルドとデバッグ ビルドで実行スクリプトを切り替える、という方法もありますが、ファイル名が環境によって変化する可能性もゼロではないので、環境変数を使います。

  • (修正前)$DWARF_DSYM_FOLDER_PATH/App.framework.dSYM
  • (修正後)$DWARF_DSYM_FOLDER_PATH/$DWARF_DSYM_FILE_NAME

このように修正します。これで、デバッグ ビルドが成功するようになります。

デバッグ情報が含まれていない dSYM

但し、デバッグ ビルドで dSYM が生成される設定になっているか、確認が必要です。この時点で『アイナーノ』では、以下がビルド時にメッセージで出ていました。

warning: (arm64) /Users/cutboss/Library/Developer/Xcode/DerivedData/Runner-guaqojlzlufgapivgpbratcmscml/Build/Products/Debug-iphonesimulator/Runner.app/Runner empty dSYM file detected, dSYM was created with an executable with no debug info.

これは、dSYM は生成されたがデバッグ情報が含まれていない、という警告です。ビルドが成功しても意味がないです。

では Xcode の [Runner] [Build Settings] の設定を確認します。

  • [Debug Information Format] を [DWARF with dSYM File] に設定
    ※デバッグ ビルドで dSYM を生成する指示
  • [Strip Debug Symbols During Copy] を [No] に設定
    ※ビルド後のバイナリからデバッグ シンボルを削除しない指示

『アイナーノ』でクリティカルだったのは、以下でした。

  • [Enable Debug Dylib Support] を [No] に設定
    ※デバッグでダイナミック ライブラリをサポートしない指示

これらの設定は、一旦、反転した設定にして、再度、期待する設定を操作する必要があります(例えば、No にしたいのなら、Yes を設定した後、改めて No を設定する)。

馬鹿馬鹿しいですが、こうしないと、設定が反映されず、かなりハマりました。 

デバッグ ビルドにおける dSYM アップロードの回避

そもそも、開発中のエラーはローカルマシンのデバッグで解決できるので、dSYM のアップロードは必要ないです。複数人で開発しているときは、クラッシュ レポートが共有できるので、利点だとは思います。

リリース ビルドでのみ、dSYM のアップロードに対応したい場合は、以下の実行スクリプトを記載します。

if [ "$CONFIGURATION" == "Debug" ]; then
  echo "Skipping dSYM upload in Debug mode."
else
  $PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:567383003300:ios:17104a2ced0c9b9b -- $DWARF_DSYM_FOLDER_PATH/App.framework.dSYM
  $PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:567383003300:ios:17104a2ced0c9b9b -- $DWARF_DSYM_FOLDER_PATH/App.framework.dSYM
fi

ちなみに、「--validate」のあり、なし、の違いだけで連続実行するこのスクリプトが Firebase が提供するサンプルですが、前者(検証)で失敗しても、それがアップロードされてしまうのは、問題に見えます。

完成形は、「--validate」の結果次第でアップロードのスキップを組み込むべきだと思いますが、今は割愛します。

所感

本件の解決では都度 ChatGPTDeepSeek に質問しました。しかし、互いに相反する応えを出されて、余計にハマりました。結論、DeepSeek の解説や方法が全て正しかったです。DeepSeek は重いので、何も質問できない時間帯があったのですが、個人的な信頼度は大きく増しました。

関連

参考

コメント

このブログの人気の投稿

Breaking Taboos and Reaching 100K Downloads: The Journey and Future of the Masturbation Tracker App "Ei Nano"