跳到主要內容

混淆 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>

一旦您混淆了二進位檔,請儲存符號檔案。如果您稍後想要取消混淆堆疊追蹤,則需要此檔案。

如需這些標記的詳細資訊,請針對您的特定目標執行 help 命令,例如

flutter build apk -h

如果輸出中未列出這些標記,請執行 flutter --version 以檢查您的 Flutter 版本。

讀取混淆的堆疊追蹤

#

若要偵錯由混淆的應用程式建立的堆疊追蹤,請使用以下步驟使其成為人類可讀的格式

  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=/<您的路徑>。例如

    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"],其中 exMaterialApp 的混淆名稱。

注意事項

#

在編寫最終會成為混淆二進位檔的應用程式時,請注意以下事項。

  • 依賴比對特定類別、函式或程式庫名稱的程式碼將會失敗。例如,以下對 expect() 的呼叫在混淆的二進位檔中將無法運作
dart
expect(foo.runtimeType.toString(), equals('Foo'));
  • 列舉名稱目前不會被混淆。