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」の結果次第でアップロードのスキップを組み込むべきだと思いますが、今は割愛します。
所感
本件の解決では都度 ChatGPT と DeepSeek に質問しました。しかし、互いに相反する応えを出されて、余計にハマりました。結論、DeepSeek の解説や方法が全て正しかったです。DeepSeek は重いので、何も質問できない時間帯があったのですが、個人的な信頼度は大きく増しました。
関連
「dSYM の欠損」に対応する | iOS | Flutter 3.29.0 | Crashlytics | Firebase
Firebase を追加する | Flutter 3.27.4 | Windows 11
コメント
コメントを投稿