如何混淆Flutter应用程序?

时间:2018-05-26 12:28:31

标签: deployment flutter obfuscation

Flutter's wiki提到混淆是一种在发布模式下的选择 然而,颤动构建命令没有相关选项 - 请参阅:
SQL> create index billcrown_grir_ix on billcrown(grir); Index created. SQL> select grirno, grirdate 2 from grirmain 3 where grirno not in 4 ( select grir 5 from billcrown 6 where grir is not null ); 900000 rows selected. Execution Plan ---------------------------------------------------------- Plan hash value: 794905065 --------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | --------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 901K| 15M| | 2018 (1)| 00:00:01 | |* 1 | HASH JOIN RIGHT ANTI | | 901K| 15M| 1664K| 2018 (1)| 00:00:01 | |* 2 | INDEX FAST FULL SCAN| BILLCROWN_GRIR_IX | 100K| 488K| | 62 (0)| 00:00:01 | | 3 | TABLE ACCESS FULL | GRIRMAIN | 1000K| 12M| | 687 (1)| 00:00:01 | --------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("GRIRNO"="GRIR") 2 - filter("GRIR" IS NOT NULL) Statistics ---------------------------------------------------------- 1 recursive calls 0 db block gets 62577 consistent gets 223 physical reads 0 redo size 24221330 bytes sent via SQL*Net to client 660596 bytes received via SQL*Net from client 60001 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 900000 rows processed

我在这里遗漏了什么吗? 他们是否将混淆作为默认值?
混淆甚至与颤动有关吗?

对此的任何指示都将非常感激。

7 个答案:

答案 0 :(得分:8)

对于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>

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

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

答案 1 :(得分:5)

enter image description here https://flutter.dev/docs/deployment/obfuscate请参阅此链接以获取更多信息

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

答案 2 :(得分:2)

对于 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 到摇树图标

答案 3 :(得分:1)

目前,通过扑动的CLI没有直接暴露出模糊处理。

你可以试着像这样明确地将争论传递给gen_snapshot

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

注意:混淆支持的测试不是很好,目前可能无法正常工作。

答案 4 :(得分:1)

需要混淆 - 一个颤动的应用程序知道它的函数名称,可以使用Dart的StackTrace类显示。对于模糊处理有测试不足支持。启用它:

适用于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  

(运行&#34; flutter&#34;提交后重建颤振工具。)

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

EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate

PS:Haven没有尝试https://github.com/dart-lang/sdk/issues/30524中提到的--save-obfuscation-map标志 再次,如@mraleph所述,混淆不是非常好测试

答案 5 :(得分:1)

对于 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 进行混淆构建
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

答案 6 :(得分:0)

以上所有答案都是正确的,但是没有答案告诉您在生成版本时我们需要添加相对路径或目录路径。

使用相对路径的示例:

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

使用文件夹路径的示例:

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

以上命令将在给定的项目目录中生成一个内部版本,它将在相应的命令上创建一个名为ProjectFolderName或'debug'的新文件夹,您可以在此处找到发行版本。