混淆 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 版本。
讀取混淆的堆疊跟蹤
如果你需要除錯被混淆的應用程式建立的堆疊跟蹤,請遵循以下步驟將其解析為人類可讀的內容:
-
找到與應用程式對應的符號檔案。例如,在 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
指令。
Read an obfuscated name
To make the name that an app obfuscated human readable, use the following steps:
-
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>
-
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"]
, whereex
is the obfuscated name ofMaterialApp
.
注意事項
當你打算將二進位的應用程式進行混淆時,需要注意以下內容:
-
使用對應特定的類、函式或函式庫名的程式碼將會失效。例如,以下在混淆的二進位檔案中對
expect()
的呼叫就不會工作:
expect(foo.runtimeType.toString(), equals('Foo'));
- Enum names are not obfuscated currently.