用 Flutter 打包 iOS 应用的一些细节知识
热重载 https://flutter.io/hot-reload/ 观测工具 https://dart-lang.github.io/observatory/get-started.html
△ 在 Xcode 中看到的 Flutter 应用视图层级结构
应用包
使用 flutter build ios --release 命令创建 (或使用 IDE 直接创建) 的应用包 (application bundle) 看起来和典型的 iOS 应用包是相似的,该代码包内含应用可执行文件,以及所有引用到的框架和资源。
比如 Flutter 为 Runner 这个应用生成的代码包结构如下:
编译应用
您在编译应用的发布版本 (Release 版本,注意和 Profile 和 Debug 不同) 时,需要来自 buildbots 和主机的工件。(说到 buildbots,引擎部分使用的是 GN 和 Ninja,这里就不展开细说了,如果想要贡献代码至 Flutter,请查看我们的官方指引文档。)
了解 Flutter 的构建模式
https://github.com/flutter/flutter/wiki/Flutter's-modes
了解 buildbots
https://build.chromium.org/p/client.flutter/waterfall
贡献代码至 Flutter
https://github.com/flutter/engine/blob/master/CONTRIBUTING.md
Flutter Engine 框架包
Flutter 引擎: 内含核心库 (如图形、文件和网络 I/O、可访问性支持、插件体系架构)、DartVM 和 Skia 渲染器。 Flutter 引擎引用的资源: 目前仅含 ICU 数据。
Flutter 引擎的 framework bundle 由 buildbots 生成,然后 Flutter 工具将其下载并缓存在电脑本地。
Flutter 引擎
https://github.com/flutter/engine
AOT 框架包
$ nm -gU Runner.app/Frameworks/App.framework/App
Runner.app/Frameworks/App.framework/App (for architecture armv7):
003c6f60 S _kDartIsolateSnapshotData
00007000 T _kDartIsolateSnapshotInstructions
003c16a0 S _kDartVmSnapshotData
00004000 T _kDartVmSnapshotInstructions
Runner.app/Frameworks/App.framework/App (for architecture arm64):
00000000004041a0 S _kDartIsolateSnapshotData
0000000000009000 T _kDartIsolateSnapshotInstructions
00000000003fc740 S _kDartVmSnapshotData
0000000000005000 T _kDartVmSnapshotInstructions
上述 4 个标识的具体说明如下:
Dart VM 快照 (kDartVmSnapshotData): 代表 isolate 之间共享的 Dart 堆 (heap) 的初始状态。有助于更快地启动 Dart isolate,但不包含任何 isolate 专属的信息。
Dart VM 指令 (kDartVmSnapshotInstructions): 包含 VM 中所有 Dart isolate 之间共享的通用例程的 AOT 指令。这种快照的体积通常非常小,并且大多会包含程序桩 (stub)。
Isolate 快照 (kDartIsolateSnapshotData): 代表 Dart 堆的初始状态,并包含 isolate 专属的信息。
Isolate 指令 (kDartIsolateSnapshotInstructions): 包含由 Dart isolate 执行的 AOT 代码。
调用 gen_snapshot 很简单。只需将其指向 Dart 源代码,它就会为这四个标识中的每一个提供 Blob。然后,Xcode 将这些打包到 iOS framework bundle 中,这个过程和使用 C、C++、Objective-C 或 Swift 编写的框架一样。
进一步了解如何配置快照和引擎 https://github.com/flutter/engine/wiki/Flutter-Engine-Operation-in-AOT-Mode#snapshot-generation
除了打包代码之外,Flutter 工具还会读取项目 pubspec.yaml 文件中所列出的资源,从而确保应用 (及其使用的插件) 所引用的资源也会被收录进应用包中。
关于 Android 的一些说明
Flutter 引擎打包为 ELF 库 (libflutter.so)。 前文中介绍的 4 个标识现在只是 Assets 目录中的二进制 Blob。
进一步了解 Flutter 引擎的 Android 配置细节 https://github.com/flutter/engine/wiki/Flutter-Engine-Operation-in-AOT-Mode#android-configuration
总结
您可以将 Flutter 视图放置在本地视图层级结构中的任何位置。Flutter 渲染出来的所有内容都会合并到此视图中。 Dart 代码像其他任何 C++ / Objective-C / Swift 代码库一样,都会被编译为原生机器码,并打包为库或 framework bundle。这意味着所有崩溃报告和标识工具都会以相同的方式作用于 Dart AOT 代码。 您可以将 Flutter 集成到自己的构建系统中,而不必依赖开发设备上的 Flutter 工具 (尽管使用这些工具可以让您的工作更轻松些)。所有工具都可以在 Flutter SDK 的 bin/cache 目录中找到。
想了解更多 Flutter 内容?
在公众号首页发送关键词 "Flutter",获取相关历史技术文章;
还有更多疑惑?欢迎点击菜单 "联系我们" 反馈您在开发过程中遇到的问题。
推荐阅读