Dartコードを難読化する
コードの難読化とは何ですか?
コードの難読化を変更するプロセスです アプリのバイナリを変更して人間が理解しにくくする。 難読化により関数名とクラス名が隠蔽されます。 コンパイルされた Dart コード。各シンボルを次のように置き換えます。 別のシンボルにより、攻撃者が困難になります 独自のアプリをリバースエンジニアリングします。
Flutter のコード難読化は機能します のみリリースビルド。
制限事項
コードを難読化すると、いいえリソースを暗号化することも、保護することもありません。 リバースエンジニアリング。 よりあいまいな名前のシンボルの名前のみが変更されます。
サポートされているターゲット
以下のビルドターゲット 難読化プロセスをサポートする このページで説明されています:
aar
apk
appbundle
ios
ios-framework
ipa
linux
macos
macos-framework
windows
アプリを難読化する
アプリを難読化するには、flutter build
指図
リリースモードで
とともに--obfuscate
と--split-debug-info
オプション。
の--split-debug-info
オプションでディレクトリを指定します
ここで、Flutter はデバッグ ファイルを出力します。
難読化の場合は、シンボル マップを出力します。
例えば:
$ flutter build apk --obfuscate --split-debug-info=/<project-name>/<directory>
バイナリを難読化したら、保存 シンボルファイル。後で行う場合にこれが必要になります スタック トレースの難読化を解除したい。
これらのフラグの詳細については、次のコマンドを実行してください。 特定のターゲットのヘルプ コマンド。例:
$ flutter build apk -h
これらのフラグが出力にリストされていない場合は、
走るflutter --version
Flutter のバージョンを確認します。
難読化されたスタック トレースを読み取る
難読化されたアプリによって作成されたスタック トレースをデバッグするには、 人間が読める形式にするには、次の手順を使用します。
-
一致するシンボル ファイルを見つけます。 たとえば、Android arm64 からのクラッシュ デバイスに必要な
app.android-arm64.symbols
。 -
両方のスタック トレースを提供します (ファイルに保存) そしてシンボルファイルを
flutter symbolize
指図。 例えば:$ flutter symbolize -i <stack trace file> -d out/android/app.android-arm64.symbols
詳細については、
symbolize
指図、 走るflutter symbolize -h
。
難読化された名前を読む
アプリによって難読化された名前を人間が読めるようにするには、 次の手順を使用します。
-
アプリのビルド時に名前難読化マップを保存するには、 使用
--extra-gen-snapshot-options=--save-obfuscation-map=/<your-path>
。 例えば:$ flutter build apk --obfuscate --split-debug-info=/<project-name>/<directory> --extra-gen-snapshot-options=--save-obfuscation-map=/<your-path>
-
名前を回復するには、生成された難読化マップを使用します。 難読化マップは、次のペアを含むフラットな JSON 配列です。 元の名前と難読化された名前。例えば、
["MaterialApp", "ex", "Scaffold", "ey"]
、 どこex
の難読化された名前ですMaterialApp
。
警告
アプリをコーディングするときは、次の点に注意してください。 最終的には難読化されたバイナリになります。
- 特定のクラス、関数、
そうでない場合、ライブラリ名は失敗します。
たとえば、次の呼び出しは、
expect()
しません 難読化されたバイナリで動作します。
expect(foo.runtimeType.toString(), equals('Foo'));
- 現在、列挙型名は難読化されていません。