如何混淆 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
- 为 iOS
进行混淆构建
flutter build ios --release --obfuscate --split-debug-info=misc/mapping/${version}
它创建文件 misc/mapping/1.0.0/app.ios-arm64.symbols
- 这也会修改
ios/Flutter/Generated.xcconfig
以包含
DART_OBFUSCATION=true
SPLIT_DEBUG_INFO=misc/mapping/1.0.0
- 使用 Xcode 菜单:
Product > Archive
将使用 Release.xcconfig
,其中包括更新的 Generated.xcconfig
#include "Generated.xcconfig"
因此您上传的存档现在将被混淆(您不需要对 Release.xcconfig
进行更改)
另见 - https://github.com/flutter/flutter/issues/64626#issuecomment-736081173
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 所述。
注意: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
- 为 iOS 进行混淆构建
flutter build ios --release --obfuscate --split-debug-info=misc/mapping/${version}
它创建文件 misc/mapping/1.0.0/app.ios-arm64.symbols
- 这也会修改
ios/Flutter/Generated.xcconfig
以包含
DART_OBFUSCATION=true
SPLIT_DEBUG_INFO=misc/mapping/1.0.0
- 使用 Xcode 菜单:
Product > Archive
将使用Release.xcconfig
,其中包括更新的Generated.xcconfig
#include "Generated.xcconfig"
因此您上传的存档现在将被混淆(您不需要对 Release.xcconfig
进行更改)
另见 - https://github.com/flutter/flutter/issues/64626#issuecomment-736081173