👀

Flutter アプリにおける Dart コードの難読化と Sentry へのデバッグ情報のアップロード

2024/07/17に公開

Flutter を用いて実装したアプリケーションの Dart コードを難読化する方法についてまとめます。

難読化とは

ソフトウェアにおける難読化(英: obfuscation)とは、コンピュータプログラムの動作を変えずに、プログラムコードの内部的なサブルーチン(手続き)の内容・構造・データなどを、人間にとって読み取りにくくなるように改変・加工すること。難読化の対象はソースコードであったり、ソースコードから生成されるマシンコードまたはバイトコードなどの中間表現であったりすることもある。難読化されたコード(obfuscated code)は第三者によるプログラムの解読・解析が困難になる。
https://ja.wikipedia.org/wiki/難読化_(ソフトウェア)

コード解析を困難にすることは、セキュリティの向上だけでなく、著作権・商標権の保護にも役立ちます。

Flutter アプリケーションの難読化

Flutter アプリでは --obfuscate オプションを指定することで、Dart コードを難読化することができます。

flutter build <build target> --obfuscate

Flutter アプリでは、リリースビルド時のみ難読化が可能です。しかし Web アプリケーションのビルドでは難読化がサポートされていません。
https://docs.flutter.dev/deployment/obfuscate#supported-targets

デバッグ情報の出力先の指定

Sentry などのエラーレポートツールを導入している場合、エラーが発生した際にスタックトレースが送信されます。しかし、難読化されたコードのスタックトレースは解析が困難になります。これを回避するためにビルド時に --split-debug-info を指定してデバッグ情報をアプリの外に出力します。このデバッグ情報をエラーレポートツールにアップロードすることで、難読化されたコードのスタックトレースを解析できます。

# --split-debug-info で指定するパスはプロジェクトのルートに対するパスにする
# --split-debug-info=debug_info は project_root/debug_info にデバッグ情報を出力することになる
# --split-debug-info=~/debug_info としてもユーザーディレクトリ直下ではなく project_root/~/debug_info に出力される
flutter build <build target> --obfuscate --split-debug-info=<output directory>

Sentry へのデバッグ情報のアップロード

難読化されていない場合

Sentry にデバッグ情報をアップロードするためには sentry_dart_plugin を導入して必要に応じて設定を pubspec.yaml に追記します。

dev_dependencies:
  sentry_dart_plugin: ^2.0.0

# アップロードの設定
# コマンドライン引数や properties ファイルで設定することも可能
# 詳しくは https://github.com/getsentry/sentry-dart-plugin?tab=readme-ov-file#configuration-optional を参照
sentry:
  project: プロジェクト名
  org: 組織名
  upload_debug_symbols: true # デフォルトで true になっているが、明示的に設定することも可能
  ...

その上で下記のコマンドを実行することで、デバッグ情報をアップロードすることができます。ビルド時に --obfuscate--split-debug-info を指定しない場合は、完全なスタックトレースが送信されます。

flutter packages pub run sentry_dart_plugin
# fvm dart run sentry_dart_plugin などでも実行可能

難読化された場合

難読化された場合は Sentry CLI を使用してデバッグ情報をアップロードして、スタックトーレスの解析が行えるようにする必要があります。詳細は公式ドキュメントに委ねますが iOS 向けのビルドの場合は、--split-debug-info で指定したフォルダには必要な dSYM ファイルが存在せず project_root/build/ios/Release-iphoneos/Runner.app.dSYM に出力されることに注意が必要です。

参考

Discussion