混淆 Dart 程式碼

什麼是程式碼混淆?

程式碼混淆 是一種將應用程式二進位檔案轉換為功能上等價,但人類難於閱讀和理解的行為。在編譯 Dart 程式碼時,混淆會隱藏函式和類別的名稱,並用其他符號替代每個符號,從而使攻擊者難以進行逆向工程。

Flutter 的程式碼混淆功能僅在 生產建立 上生效。

侷限性

請注意,混淆你的程式碼並 不會 加密資源,也不能防止逆向工程。它只是用更晦澀的名稱重新命名這些符號。

支援的建立目標

以下建立目標支援本篇介紹的混淆過程:

  • aar
  • apk
  • appbundle
  • ios
  • ios-framework
  • ipa
  • linux
  • macos
  • macos-framework
  • windows

混淆你的應用程式

要混淆你的應用程式,請在 release 模式下使用 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 版本。

讀取混淆的堆疊跟蹤

如果你需要除錯被混淆的應用程式建立的堆疊跟蹤,請遵循以下步驟將其解析為人類可讀的內容:

  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 指令。

Read an obfuscated name

To make the name that an app obfuscated human readable, use the following steps:

  1. To save the name obfuscation map at app build time, use --extra-gen-snapshot-options=--save-obfuscation-map=/<your-path>. For example:

    $ flutter build apk --obfuscate --split-debug-info=/<project-name>/<directory> --extra-gen-snapshot-options=--save-obfuscation-map=/<your-path>
    
  2. To recover the name, use the generated obfuscation map. The obfuscation map is a flat JSON array with pairs of original names and obfuscated names. For example, ["MaterialApp", "ex", "Scaffold", "ey"], where ex is the obfuscated name of MaterialApp.

注意事項

當你打算將二進位的應用程式進行混淆時,需要注意以下內容:

  • 使用對應特定的類、函式或函式庫名的程式碼將會失效。例如,以下在混淆的二進位檔案中對 expect() 的呼叫就不會工作:

expect(foo.runtimeType.toString(), equals('Foo'));
  • Enum names are not obfuscated currently.