Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

【Flutter】FlutterのDartコードの難読化について

TL;DR;

  • Dartコードの難読化には buildOptionとして --obfuscate --split-debug-info をつける

難読化について

難読化はクラス名やメソッド名を変更し、バイナリサイズを落とすことを主な目的としているらしい。 例えば、 SpecialCatクラスをaに置き換えるといったことを行う。

難読化の効果として、リバースエンジニアリングをしずらくするということが上げられることもあるが、 AndroidのR8による難読化の説明のページにはその点に関する言及はなく、実際はそこまでの効果はないのかもしれない。(とはいえクラス名やメソッド名が生で出力されているよりはしずらくはなる...はず?)

Flutterでの難読化について

Flutterでの難読化においては、各OSのコードの難読化に加えて、 Dartコード部分の難読化を行う必要がある。 難読化の仕組みに関して、Flutter 1.16.2以前は下記の記事に記載のあるように少々手間がかかった。

github.com

Flutter 1.16.2以降は非常に簡単に難読化ができるようになっており、ビルド時のコマンドに下記の引数を付与することで難読化が可能となっている。

  • --obfuscate
    • このオプションがあることで難読化を行うことを示す。
  • --split-debug-info
    • symbolファイルの出力先を指定する。難読化を戻すために使用する。
  • 注: 上記のオプションは2つ同時に使用する必要がある(片方のみの場合エラー)
// 例
// --split-debug-infoには任意のフォルダを指定可能
flutter build apk --obfuscate --split-debug-info=obfuscate/android
flutter build ios  --obfuscate --split-debug-info=obfuscate/ios

下記の公式ドキュメントに詳しい記載あり。 flutter.dev

注意点

FlutterでのCrash検知ツールとしてFirebase Crashlyticsを使用することが多いかと思うが、難読化の解読に関しては以前のバージョンではサポートされていなかった。以下のPRで対応が実施されたようである。

fix(firebase_crashlytics): Include obfuscated stack traces by untp · Pull Request #4407 · FirebaseExtended/flutterfire · GitHub

ChangelogをみるとCrashlytics 2.0.1で対応が入ったようなので、難読化する場合は2.0.1以降のバージョンを使用するよう気をつける必要がある。

firebase_crashlytics | Flutter Package

参考