混淆Flutter和生成地图文件的建议


Sentry上に表示された難読化されたDartコードのエラー

Tr; dl

如果在部署Flutter应用程序时混淆了Dart代码,则还会混淆诸如Sentry之类的错误报告,因此混淆时要同时创建一个地图文件。

  • "第6次东京扑扑聚会"中使用的材料:https://speakerdeck.com/matsue/flutterapurifalsenan-du-hua-toerarepoto-ios

  • 英文版:https://medium.com/@waytoa/obfuscating-flutter-code-and-generate-map-files-for-ios-fdaf4a377ec4

混淆iOS应用程序

的Dart代码

Flutter的应用发布文档中有关于Dart代码混淆的描述。

  • iOS应用发布文档:https://flutter.io/docs/deployment/ios

  • Android应用发布文档:https://flutter.io/docs/deployment/android

  • Dart代码的混淆:https://github.com/flutter/flutter/wiki/Obfuscating-Dart-Code

在iOS上,以下2个文件将被修改。

  • <ProjectRoot>/packages/flutter_tools/bin/xcode_backend.sh
  • <ProjectRoot>/ios/Flutter/Release.xcconfig

根据

文档进行编辑后,运行fluuter buil ios并查看生成结果中包含的App.framework,以确保对其进行了混淆。

1
2
3
4
5
6
$ strings build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework/App
...
get:_vxa@7048458x
get:_aLa@9040228x
get:_DLa@7048458x
...

如果未混淆,则App.framework将看起来像这样。

1
2
3
4
5
6
$ strings build/ios/Release-iphoneos/Runner.app/Frameworks/App.framework/App
...
get:_count@7048458
get:_onData@9040228
get:_isSubscribed@7048458
...

由于混淆,我们已经确认代码中的各种名称已更改为无意义的字符串。

Sentry

进行的错误跟踪

在撰写本文时,很容易将Flutter用于与Crashlytics和Sentry相对应的服务。

  • 如何嵌入Sentry:https://flutter.io/docs/cookbook/maintenance/error-reporting

根据上述文档进行设置后,可以通过将以下代码放在Flutter编写的代码中的某个位置来验证是否正确报告了崩溃。

1
throw new ArgumentError('Test error');

混淆之前,Sentry将报告以下错误:

1
main.dart in SampleApp.build at line 48

但是,混淆后的错误如下。

1
SEd in bZ.opa at line 48

我看不懂我在开发什么?
--save-obfuscation-map选项添加到<ProjectRoot>/ios/Flutter/Release.xcconfig以读取此错误的内容。

1
EXTRA_GEN_SNAPSHOT_OPTIONS=--obfuscate,--save-obfuscation-map=build/ios_dart_symbols_${FLUTTER_BUILD_NUMBER}.json

通过查看生成的文件,您可以找到混淆的错误报告的功能名称等。

1
2
3
4
5
6
$ cat ios_dart_symbols_1.json
...
"_BuildJsonListener"、 "_ Gf"、
"CustomSymbolRenderer"、 "cs"、
"devicePixelRatio"、 "saa"、
...

结论

这次,我们以iOS构建为例,但是您也可以通过在Android构建步骤中添加--save-obfuscation-map来生成模糊的地图文件。

也许Firebase Crashlytics会在不久的将来正式支持Flutter,并且在这里也应该很舒适。
在发布之前,当使用Sentry混淆Dart时,我们还要生成一个地图文件??