Flutter的代码混淆
flutter的代码混淆就是混淆dart代码。代码混淆是修改应用程序二进制文件的过程,以使人们更难以理解。混淆将函数名和类名隐藏在已编译的Dart代码中,从而使攻击者很难对您的专有应用程序进行反向工程。
Flutter代码混淆的做法
一、Flutter版本小于1.16
Android
将以下行添加到<ProjectRoot> /android/gradle.properties
:
extra-gen-snapshot-options=--obfuscate
有关混淆Android主机的信息,请参阅“准备发布Android应用”中的启用Proguard。
iOS
- 修改
build aot
调用
将以下标志添加到 /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
修改xcode_backend.sh
时,要记得在build aot
里的前一行加“\".
2.修改发布配置 在<ProjectRoot> /ios/Flutter/Release.xcconfig
中,添加以下行:
EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate
二、Flutter 1.16.2或更高版本
要混淆应用程序,请使用--obfuscate
标志和--split-debug-info
标志相结合来构建发行版本。
--split-debug-info
标志指定Flutter可以在其中输出调试文件的目录。该命令生成符号图。目前支持apk,appbundle,ios和ios框架目标。(master和dev通道支持macos和aar。)例如:
flutter build apk --obfuscate --split-debug-info=/<project-name>/<directory>
混淆二进制文件后,请保存符号文件。如果以后要取消混淆堆栈跟踪,则需要这个文件。
请注意,--split-debug-info
标志也可以单独使用。实际上,它可以大大减少代码大小。有关应用程序大小的更多信息,请参阅测量应用程序的大小(https://flutter.dev/docs/perf/app-size)。
读取混淆的堆栈跟踪
要调试由模糊处理的应用程序创建的堆栈跟踪,请使用以下步骤使其易于阅读:
- 找到匹配的符号文件。例如,从Android arm64设备崩溃将需要
app.android-arm64.symbols
。 - 向
flutter symbolize
命令提供堆栈跟踪(存储在文件中)和符号文件。例如:
flutter symbolize -i <stack trace file> -d /out/android/app.android-arm64.symbols
⚠️警告
在编写最终将成为混淆的二进制代码的应用程序时,请注意以下几点。
- 依赖于匹配特定类,函数或库名称的代码将失败。例如,以下对
Expect()
的调用在混淆的二进制文件中将不起作用:
expect(foo.runtimeType.toString(), equals('Foo'))
作者:__white