https://firebase.google.com/docs/crashlytics/get-started?platform=flutter
の通りに手順を実行したはずが、Firebase consoleよりCrashlyticsの画面を見ると、dSYMが送信されてなかった。
前提
- cocoapodsは、brew経由でインストールしていた
- rubyはasdfでインストールしていた
どうなっていたか
ビルドは普通に成功し、
https://firebase.google.com/docs/crashlytics/get-started?platform=flutter#force-test-crash
に記載されている test crash を実行すると、Crashlytics上でクラッシュ自体は確認できる。
ただし、「dSYMがありません」的なエラーが表示されていた。
結論
asdf経由でインストールしていたrubyが、うまく動作していなかった。
(おそらく、asdfのバージョンアップ時に何かが起こっており、shimがきれいに切り替わっていなかった)
ruby --version
などを実行すると、以下のような感じになっていた。
/Users/.../.asdf/shims/ruby: line 3: /opt/homebrew/Cellar/asdf/0.9.0/libexec/bin/asdf: No such file or directory
/Users/.../.asdf/shims/ruby: line 3: exec: /opt/homebrew/Cellar/asdf/0.9.0/libexec/bin/asdf: cannot execute: No such file or directory
一度 ~/.asdf/shims/ruby
を削除して、 asdf reshim ruby 3.1.1
を実行すると、正常になった。
> rm /Users/.../.asdf/shims/ruby
> asdf reshim ruby 3.1.1
> ruby --version
ruby 3.1.1p18 (2022-02-18 revision 53f5fc4236) [arm64-darwin21]
その後、対象のFlutter projectの ios
ディレクトリにて、 pod install
を再実行。
するとBuild Phasesに "[firebase_crashlytics] Crashlytics Upload Symbols" が作成された。
改めて、Flutterアプリをビルド、test crashを再度起こしてみたりしていると、Crashlyticsで詳細が確認できるようになった。
中身を見てみた
もともと、flutterfire configure
で配置される firebase_app_id_file.json
の意味を調べていた。
https://github.com/firebase/flutterfire で .
を押してVSCodeを起動、 firebase_app_id_file.json
を検索すると、 crashlytics_add_upload_symbols
というスクリプトで使っていた。
crashlytics_add_upload_symbols
で再度検索すると、 firebase_crashlytics.podspec
でrubyを利用して実行されており、おそらく pod install
時に実行されるんだろうと予想できた。
https://github.com/firebase/flutterfire/blob/f3a6bdc5fd2441ed3c77a9d0ece0d6460afd2ec4/packages/firebase_crashlytics/firebase_crashlytics/ios/firebase_crashlytics.podspec#L10
改めて、自分のプロジェクトで pod install
を実行してみると、先のrubyのエラーが発生していたため、原因が特定できた。
(VSCode上でFlutterアプリとして実行していると、このあたりのエラー?警告?が表示されてない気がする。このせいで、なかなか気づけなかった。)
感想
おそらく、多くの開発者は cocoapods
をrubyのgemとしてインストールするため、 pod
コマンドが動いていれば、 ruby
コマンドも成功するんだと思われる。
自分の環境では、M1 (Apple Silicon) でcocoapodsを gem install
することに挫けてしまったので、Homebrew経由でインストールしていたため、こんな自体が発生したのだと思う。
FlutterアプリをiOSにビルドするために、cocoapodsが必要だと認識していたけど、単体のrubyも利用されていることまで気が回っていなかった。。。