混淆 Dart 代码 您所在的位置:网站首页 flutter有哪些成功的案例 混淆 Dart 代码

混淆 Dart 代码

2024-07-13 19:29| 来源: 网络整理| 查看: 265

description bug_report 混淆 Dart 代码 目录 keyboard_arrow_down keyboard_arrow_up 什么是代码混淆? 局限性 支持的构建目标 混淆你的应用程序 读取混淆的堆栈跟踪 Read an obfuscated name 注意事项 more_horiz 什么是代码混淆? #

代码混淆 是一种将应用程序二进制文件转换为功能上等价,但人类难于阅读和理解的行为。在编译 Dart 代码时,混淆会隐藏函数和类的名称,并用其他符号替代每个符号,从而使攻击者难以进行逆向工程。

Flutter 的代码混淆功能仅在 生产构建 上生效。

局限性 #

请注意,混淆你的代码并 不会 加密资源,也不能防止逆向工程。它只是用更晦涩的名称重命名这些符号。

warning 请注意

在应用程序中存储重要私密的信息(如密码、密钥等)是一种 非常不安全的做法。

支持的构建目标 #

以下构建目标支持本篇介绍的混淆过程:

aar apk appbundle ios ios-framework ipa linux macos macos-framework windows info 提示

Web 应用不支持混淆。因为当你构建 Flutter Web 应用发布版本时, Web 应用已经经过了 压缩 处理。 Web 压缩提供了与混淆相似的效果。

混淆你的应用程序 #

要混淆你的应用程序,请在 release 模式下使用 flutter build 命令,并使用 --obfuscate 和 --split-debug-info 选项。 --split-debug-info 选项指定了 Flutter 输出调试文件的目录。在混淆的情况下,它会输出一个符号表。请参考以下命令:

flutter build apk --obfuscate --split-debug-info=//

一旦你混淆了二进制文件,请务必 保存符号表文件。如果你将来需要解析混淆后的堆栈跟踪,你将需要该文件。

lightbulb 小提示

--split-debug-info 选项也可以不使用 --obfuscate 来提取 Dart 程序符号,以减少代码体积。想了解更多关于应用体积的信息,请查阅 测量你的应用体积。

关于这些标志的详细信息,请运行特定构建目标类型的帮助命令,例如:

flutter build apk -h

如果输出中没有列出这些标志,请运行 flutter --version 命令,检查你的 Flutter 版本。

读取混淆的堆栈跟踪 #

如果你需要调试被混淆的应用程序创建的堆栈跟踪,请遵循以下步骤将其解析为人类可读的内容:

找到与应用程序匹配的符号文件。例如,在 Android arm64 设备崩溃时,需要 app.android-arm64.symbols 文件。

向 flutter symbolize 命令提供堆栈跟踪(存储在文件中)和符号文件。例如:

flutter symbolize -i -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=/. For example:

flutter build apk --obfuscate --split-debug-info=// --extra-gen-snapshot-options=--save-obfuscation-map=/

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() 的调用就不会工作:

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


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有