如何混淆 Flutter 应用程序?

How to obfuscate Flutter apps?

Flutter's wiki 提到混淆是在发布模式中选择加入。
然而,flutter build 命令没有相关选项 - 请参阅:
flutter help -v build apk

我是不是漏掉了什么?
他们是否将混淆设为默认设置?
混淆甚至与 flutter 相关吗?

如有任何建议,我们将不胜感激。

目前混淆并没有通过 flutter CLI 直接公开。

您可以像这样尝试将参数显式传递给 gen_snapshot

flutter build --extra-gen-snapshot-options=--obfuscate,--save-obfuscation-map=build/symbols.json --release

注意:混淆支持尚未经过充分测试,目前可能无法正常工作。

需要混淆 - flutter 应用程序知道它的函数名称,可以使用 Dart 的 StackTrace class 显示。 未测试 支持混淆。要启用它:


对于Android:
添加到文件 [ProjectRoot]/android/gradle.properties :

extra-gen-snapshot-options=--obfuscate

对于iOS:
首先,编辑 [FlutterRoot]/packages/flutter_tools/bin/xcode_backend.sh:
找到 build aot 调用,并向其添加一个标志,

${extra_gen_snapshot_options_or_none}

定义为:

local extra_gen_snapshot_options_or_none=""
if [[ -n "$EXTRA_GEN_SNAPSHOT_OPTIONS" ]]; then
  extra_gen_snapshot_options_or_none="--extra-gen-snapshot-options=$EXTRA_GEN_SNAPSHOT_OPTIONS"
fi

要在 [FlutterRoot] 中应用您的更改,运行

git commit -am "Enable obfuscation on iOS"  
flutter  

(运行 "flutter" 提交后重建 flutter 工具。)

接下来,在您的项目中,将以下内容添加到 [ProjectRoot]/ios/Flutter/Release.xcconfig 文件:

EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate

PS:还没有尝试过 https://github.com/dart-lang/sdk/issues/30524
中提到的 --save-obfuscation-map 标志 同样,混淆 不是 很好 测试 ,如 @mraleph 所述。

https://flutter.dev/docs/deployment/obfuscate请参阅此 link 了解更多信息

注意:Flutter的代码混淆,Flutter 1.16.2支持。

AppBundle(推荐):

  • 不拆分:

    flutter build appbundle --obfuscate --split-debug-info=/<directory>
    
  • 分裂:

    flutter build appbundle --target-platform android-arm,android-arm64,android-x64 --obfuscate --split-debug-info=/<directory>
    

APK:

  • 不拆分:
    flutter build apk --obfuscate --split-debug-info=/<directory>
    
  • 分裂:

    flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi --obfuscate --split-debug-info=/<directory>
    

PS:关于拆分:
默认情况下,fat apk 包含 arm v7、arm v8 和 x64,这会增加 apk 的大小,这是您不希望的。因此,当您拆分它时,您将拥有单独的二进制文件,您可以将其上传到商店,从而减少用户需要下载的 apk 的大小。

以上答案都正确,但没有一个答案告诉你生成build时需要添加相对路径或目录路径。

使用相对路径的示例:

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

使用文件夹路径的示例:

flutter build apk --obfuscate --split-debug-info=/Users/apple/Desktop/items/debug

以上命令将在给定的项目目录中生成一个构建,它将在相应的命令中创建一个名为 ProjectFolderName 或 'debug' 的新文件夹,您可以在其中找到发布构建。

对于 iOS 编辑 ios/Flutter/Release.xcconfig

此文件应包含类似

的内容
#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

如果你检查 Generated.xcconfig 有一行 DART_OBFUSCATION=false

所以在 Release.xcconfig 文件末尾添加相反的内容来覆盖:

#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"

DART_OBFUSCATION=true
SPLIT_DEBUG_INFO=obj_maps

您也可以选择在此处添加 TREE_SHAKE_ICONS=true 到 tree-shake 图标

Android 的过程在 https://flutter.dev/docs/deployment/obfuscate 的文档中非常清楚。例如:

export version=1.0.0
flutter build apk --release --shrink --obfuscate --split-debug-info=misc/mapping/${version}

将创建几个文件,例如 misc/mapping/1.0.0/app.android-arm64.symbols(您可能希望将其保留在 VCS 中)

对于iOS来说不太明显,因为你经常使用Xcode菜单:Product > Archive

  1. 为 iOS
  2. 进行混淆构建
flutter build ios --release --obfuscate --split-debug-info=misc/mapping/${version}

它创建文件 misc/mapping/1.0.0/app.ios-arm64.symbols

  1. 这也会修改 ios/Flutter/Generated.xcconfig 以包含
DART_OBFUSCATION=true
SPLIT_DEBUG_INFO=misc/mapping/1.0.0
  1. 使用 Xcode 菜单:Product > Archive 将使用 Release.xcconfig,其中包括更新的 Generated.xcconfig
#include "Generated.xcconfig"

因此您上传的存档现在将被混淆(您不需要对 Release.xcconfig 进行更改)

另见 - https://github.com/flutter/flutter/issues/64626#issuecomment-736081173