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
根据
文档进行编辑后,运行
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 ... |
如果未混淆,则
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 |
我看不懂我在开发什么?
将
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构建步骤中添加
也许Firebase Crashlytics会在不久的将来正式支持Flutter,并且在这里也应该很舒适。
在发布之前,当使用Sentry混淆Dart时,我们还要生成一个地图文件??