混淆 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 版本。

阅读混淆的堆栈跟踪

要调试由混淆的应用创建的堆栈跟踪,请使用以下步骤使其可读

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

注意事项

在编码最终将成为混淆二进制文件的应用时,请注意以下事项。

  • 依赖于匹配特定类、函数或库名称的代码将失败。例如,以下对 expect() 的调用在混淆的二进制文件中不起作用
expect(foo.runtimeType.toString(), equals('Foo'));
  • 枚举名称目前未混淆。