如何混淆Flutter应用程序?

Ehu*_*unu 9 deployment obfuscation flutter

Flutter的Wiki提到混淆是发布模式的一种选择。
但是,flutter build命令没有相关选项-请参阅:
flutter help -v build apk

我在这里想念什么吗?
他们是否将混淆设置为默认设置?
混淆甚至与颤动有关吗?

任何对此的指针将不胜感激。

jit*_*555 15

上面所有的答案都是正确的,但是没有答案告诉你我们需要在生成build.gradle文件时添加相对路径或目录路径。

使用相对路径的示例:

flutter build apk --obfuscate --split-debug-info=./ProjectFolderName/debug
                                
Run Code Online (Sandbox Code Playgroud)

使用文件夹路径的示例:

flutter build apk --obfuscate --split-debug-info=/Users/apple/Desktop/items/debug
Run Code Online (Sandbox Code Playgroud)

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


Cop*_*oad 12

对于 AppBundle:

拆分:

flutter build appbundle --obfuscate --split-debug-info=/<directory>
Run Code Online (Sandbox Code Playgroud)

分裂:

flutter build appbundle --target-platform android-arm,android-arm64,android-x64 --obfuscate --split-debug-info=/<directory>
Run Code Online (Sandbox Code Playgroud)

对于 APK:

拆分:

flutter build apk --obfuscate --split-debug-info=/<directory>
Run Code Online (Sandbox Code Playgroud)

分裂:

flutter build apk --target-platform android-arm,android-arm64,android-x64 --split-per-abi --obfuscate --split-debug-info=/<directory>
Run Code Online (Sandbox Code Playgroud)

仅适用于 Flutter 版本 v1.16.2 或更高版本。

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


aar*_*gas 9

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

export version=1.0.0
flutter build apk --release --shrink --obfuscate --split-debug-info=misc/mapping/${version}
Run Code Online (Sandbox Code Playgroud)

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

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

  1. 为 iOS 进行混淆构建
flutter build ios --release --obfuscate --split-debug-info=misc/mapping/${version}
Run Code Online (Sandbox Code Playgroud)

它创建文件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
Run Code Online (Sandbox Code Playgroud)
  1. 使用 Xcode 菜单:Product > Archive这将使用Release.xcconfig其中包括更新的Generated.xcconfig
#include "Generated.xcconfig"
Run Code Online (Sandbox Code Playgroud)

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

另请参阅 - https://github.com/flutter/flutter/issues/64626#issuecomment-736081173


Ehu*_*unu 7

需要进行混淆-Flutter应用程序知道其函数名称,可以使用Dart的StackTrace类显示该函数名称。有下测试的混淆支持。要启用它:


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

extra-gen-snapshot-options=--obfuscate
Run Code Online (Sandbox Code Playgroud)

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

${extra_gen_snapshot_options_or_none}
Run Code Online (Sandbox Code Playgroud)

定义为:

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
Run Code Online (Sandbox Code Playgroud)

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

git commit -am "Enable obfuscation on iOS"  
flutter  
Run Code Online (Sandbox Code Playgroud)

(在提交重建Flutter工具后运行“ flutter”。)

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

EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate
Run Code Online (Sandbox Code Playgroud)

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


Poo*_*til 6

在此处输入图片说明 https://flutter.dev/docs/deployment/obfuscate请参阅此链接了解更多信息

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


Dim*_*ira 6

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

该文件应包含类似内容

#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"
#include "Generated.xcconfig"
Run Code Online (Sandbox Code Playgroud)

如果你检查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
Run Code Online (Sandbox Code Playgroud)

TREE_SHAKE_ICONS=true您也可以选择在此处添加树摇图标