TL;DR;
- Dartコードの難読化には buildOptionとして --obfuscate --split-debug-info をつける
難読化について
難読化はクラス名やメソッド名を変更し、バイナリサイズを落とすことを主な目的としているらしい。
例えば、 SpecialCat
クラスをa
に置き換えるといったことを行う。
難読化の効果として、リバースエンジニアリングをしずらくするということが上げられることもあるが、 AndroidのR8による難読化の説明のページにはその点に関する言及はなく、実際はそこまでの効果はないのかもしれない。(とはいえクラス名やメソッド名が生で出力されているよりはしずらくはなる...はず?)
Flutterでの難読化について
Flutterでの難読化においては、各OSのコードの難読化に加えて、 Dartコード部分の難読化を行う必要がある。 難読化の仕組みに関して、Flutter 1.16.2以前は下記の記事に記載のあるように少々手間がかかった。
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で対応が実施されたようである。
ChangelogをみるとCrashlytics 2.0.1で対応が入ったようなので、難読化する場合は2.0.1以降のバージョンを使用するよう気をつける必要がある。
firebase_crashlytics | Flutter Package