混淆 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'));
- 枚举名称目前不会被混淆。
除非另有说明,否则本网站上的文档反映的是 Flutter 的最新稳定版本。页面最后更新于 2025-01-30。 查看源代码 或 报告问题。