混淆 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.
除非另有说明,本文档之所提及适用于 Flutter 的最新稳定版本,本页面最后更新时间: 2024-04-27。 查看文档源码 或者 为本页面内容提出建议。