Flutter製のAndroidビルドでGitHubActionsを使ってCrashlyticsに難読化解除用のシンボルファイルを送信する
ついに
先日あったFirebaseSummit2022の内容まとめを読んでいたところ、--split-debug-info
サポートが入ったとあった。
Flutterをビルドする際に--obfuscate
でコードの難読化をすることができるが、これをするとFirebaseCrashlyticsでのレポート内容も難読化されたものが表示されてしまってバグ対応が難しかった。
--obfuscate
オプションと一緒に使用する--split-debug-info
で指定したディレクトリに難読化を解除するためのシンボルファイルを出力でき、それを使えばデバッグをすることが可能になるが非常に面倒だった。
これがついにCrashlytics上で難読化が解除されるようになるとのことで飛び上がって喜んだ。
まだAndroidの方しか対応されていないようだがそれでも嬉しい。ちなみにiOSの方は数ヶ月後に対応されるようだ。
早速既存のCI上でビルド時にシンボルファイルをCrashlyticsに送信するジョブを組み込んでみる。
firebase_crashlyticsのアップデート
firebase_crashlytics
のCHANGELOGを見ると、バージョン2.9.0
で--split-debug-info
サポートが入っているようだ。
2.9.0 FEAT: Send Flutter Build Id to Crashlytics to get —split-debug-info working (#9409). (17931f30)
しかしアップデートして間も無く、Crashlytics上でCrashlytics Android SDK
で問題があったので最新版にアップデートするよう推奨するメッセージが表示されていた。
GitHubの該当イシューを見てみると、確かにクラッシュするバグがあった様子。FlutterのCrashlyticsプラグインは3.0.2
で修正されたとのことなので、それ以上のバージョンを使用することをおすすめする。
今回は現時点での最新の3.0.5
を使用する。
dependencies:
firebase_crashlytics: ^3.0.5
シンボルファイル送信のコマンド
送信にはFirebaseCLI(v11.9.0以上)を使用して、以下のコマンドを叩くとのことだ。
firebase crashlytics:symbols:upload --app=APP_ID PATH/TO/symbols
公式ドキュメントは以下。
GitHubActionsの設定
以下のように設定してみた。
- name: Build aab
run: flutter build appbundle --release --flavor production --dart-define=FLAVOR=production --obfuscate --split-debug-info=obfuscate/android
- name: Set up firebase-tools
run: npm install -g firebase-tools
- name: Upload symbol files to Crashlytics
run: firebase crashlytics:symbols:upload --app='${{ secrets.FIREBASE_APP_ID }}' obfuscate/android
ビルド完了後にfirebase-tools
をインストールし、それを使ってシンボルファイルをアップロードする。
シンボルファイルはobfuscate/android
ディレクトリに出力しているが、ディレクトリ名は自由。
また、FirebaseのアプリIDはGitHubActionsのSecretsから取得している。
ビルド全体のGitHubActions設定ファイルについてはこちらを参考にしてみていただきたい。
- Flutterで作ったAndroidアプリをGitHubActionsを使ってGooglePlayに自動デプロイする
- Flutterで作ったAndroidアプリをGitHubActionsを使ってAppDistributionに自動デプロイする
おわり
シンボルファイルが送信されしばらくすると、Crashlyticsのレポートで無事に難読化が解除されており、エラー箇所のコードが読みやすくなった。
iOSの方の対応も楽しみだ。