<

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 --versionFlutter のバージョンを確認します。

難読化されたスタック トレースを読み取る

難読化されたアプリによって作成されたスタック トレースをデバッグするには、 人間が読める形式にするには、次の手順を使用します。

  1. 一致するシンボル ファイルを見つけます。 たとえば、Android arm64 からのクラッシュ デバイスに必要なapp.android-arm64.symbols

  2. 両方のスタック トレースを提供します (ファイルに保存) そしてシンボルファイルをflutter symbolize指図。 例えば:

    $ flutter symbolize -i <stack trace file> -d out/android/app.android-arm64.symbols
    

    詳細については、symbolize指図、 走るflutter symbolize -h

難読化された名前を読む

アプリによって難読化された名前を人間が読めるようにするには、 次の手順を使用します。

  1. アプリのビルド時に名前難読化マップを保存するには、 使用--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>
    
  2. 名前を回復するには、生成された難読化マップを使用します。 難読化マップは、次のペアを含むフラットな JSON 配列です。 元の名前と難読化された名前。例えば、["MaterialApp", "ex", "Scaffold", "ey"]、 どこexの難読化された名前ですMaterialApp

警告

アプリをコーディングするときは、次の点に注意してください。 最終的には難読化されたバイナリになります。

  • 特定のクラス、関数、 そうでない場合、ライブラリ名は失敗します。 たとえば、次の呼び出しは、expect()しません 難読化されたバイナリで動作します。
expect(foo.runtimeType.toString(), equals('Foo'));
  • 現在、列挙型名は難読化されていません。