Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

FAQ #2

Open
suhao opened this issue May 5, 2019 · 18 comments
Open

FAQ #2

suhao opened this issue May 5, 2019 · 18 comments

Comments

@suhao
Copy link
Member

suhao commented May 5, 2019

Flutter 是一套高效的跨平台免费开源 SDK,可以帮助开发者用一套代码同时在 Android 和 iOS 上构建媲美原生体验的精良应用。随着 Flutter 从 1.0 升级到 1.2,从社区中搜集到了不少开发者的问题,整理后将由浅到深地进行解答。如果您对 Flutter 已经有一定的了解,不妨在看到问题的时候先试着回答,然后和给出的答案进行比较,从而进一步加深理解。

注:内容摘自于网络,感谢原作者

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q1:Flutter 是使用什么技术构建的?

Flutter 使用 C、C++、Dart 和 Skia (2D 渲染引擎) 构建。您可以参阅下面这张架构图。

image

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q2:Flutter 如何在 Android 上运行我的代码?

引擎的 C 和 C++ 代码使用 Android 的 NDK 编译。Dart 代码 (SDK 的和您写的) 都是预先 (ahead-of-time, AOT) 编译成本地 ARM 及 x86 库。这些库被包含在一个 Android "runner" 项目中,然后整套内容被编译成一个 APK。当应用启动时,它会加载 Flutter 库。任何渲染、输入或事件处理等都会 delegate 给编译好的 Flutter 和应用代码。这个工作机制与很多游戏引擎颇为相似。

调试模式时则使用虚拟机 (VM) 来运行 Dart 代码(因此这时会显示 "Debug" 字样,以提醒开发者速度会稍微变慢),这样便可以启用有状态热重载 (Stateful Hot Reload)。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q3:Flutter 如何在 iOS 上运行我的代码?

引擎的 C 和 C++ 代码使用 LLVM 编译。Dart 代码 (SDK 的和您的) 都是预先 (ahead-of-time, AOT) 编译成本地 ARM 库。这些库被包含在一个 iOS "runner" 项目中,然后整套内容被编译成一个 .ipa。当应用启动时,它会加载 Flutter 库。任何渲染、输入或事件处理等都会 delegate 给编译好的 Flutter 和应用代码。这个工作机制与很多游戏引擎颇为相似。

调试模式时则使用虚拟机 (VM) 来运行 Dart 代码 (因此这时会显示 "Debug" 字样,以提醒开发者速度会稍微变慢),这样便可以启用有状态热重载 (Stateful Hot Reload)。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q4:Flutter 是否会使用系统的 OEM widget?

不会。相反,Flutter 自己提供了一套 widget (包括 Material Design 和 iOS 风格的 Cupertino widget),由 Flutter 的框架和引擎负责管理和渲染。

我们希望最终能够产生出更高质量的应用。如果我们直接使用 OEM 自带的 widget,那么 Flutter 应用的质量和性能将受到这些 widget 质量的限制。

例如,在 Android 中,有一组硬编码的手势和固定的计算规则来区别它们。在 Flutter 中,您可以编写自己的手势识别器,它在手势系统中拥有最高的优先级。此外,由不同人创作的两个 widget 可以进行协调,以便消除手势的歧义。

如今的应用设计趋势表明,很多设计师和用户都需要动效丰富的 UI,同时富有品牌表现力。为了实现这种级别的美学定制化设计,Flutter 在架构上就会倾向于直接驱动像素,而不是交给 OEM widget 来处理。

由于使用相同的渲染器、框架和 widget,就意味着您能更加轻松地同时发布 iOS 和 Android 版本应用,而无需耗费精力和成本来规划和同步两套独立的代码库和功能集。

另外,使用单一的语言、单个框架和同一组适用于所有 UI 的库 (无论您的 UI 在每个移动平台上都各有不同还是基本一致),也有助于帮助您降低应用开发和维护成本。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q5:我的移动 OS 更新并加入新的 widget 时会怎么样?

Flutter 团队密切关注来自 iOS 和 Android 的 widget 使用和需求情况,且会与社区合作,对新的 widget 提供构建支持。这些支持可能会以这些形式来提供给开发者: 较低层级的框架功能、新的可编辑组合的 widget,或全新的 widget 实现。

Flutter 的分层架构旨在支持众多 widget 库,我们鼓励并支持社区构建和维护 widget 库

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q6:我的移动 OS 更新并加入新的平台功能时会怎么样?

Flutter 的互操作 (interop) 和插件 (plugin) 系统旨在使开发者能够立即访问新的移动操作系统特性和功能。开发者不必等待 Flutter 团队提供新系统功能的访问接口,而是自己第一时间即可使用。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q7:我能使用哪些操作系统开发 Flutter 应用?

Flutter 支持使用 Linux、Mac 和 Windows 进行开发。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q8:Flutter 是用哪种语言写成的?

对比了很多开发语言和运行时,并最终采用了 Dart 来编写框架和 widget。底层图形框架和 Dart 虚拟机在 C/C++ 中实现。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q9:Flutter 为什么选择使用 Dart?

Flutter 使用四个主要维度进行评估,并综合考虑了框架开发者、应用开发者和最终用户的需求。我们发现某些语言的确在某些维度符合要求,但 Dart 在所有评估维度上都取得了高分,并且符合我们的所有要求和标准。

Dart 的运行时和编译器支持 Flutter 的两个关键特性: 基于 JIT 的快速开发周期,允许在带类型的语言中支持形变和有状态热重载,以及一个能产出高效率 ARM 代码的 AOT 编译器,从而确保快速启动的能力和可预期的生产版本运行性能。

此外,我们还有幸与 Dart 社区展开了密切合作,Dart 社区积极投入资源改进 Dart,以便在 Flutter 中更易使用。例如,当我们采用 Dart 时,该语言还没有用于生成原生二进制文件的 AOT 工具链,这些工具有助于实现稳定的高性能表现,但在 Dart 团队为 Flutter 构建了这些工具后,这个缺失已经不复存在了。同样,Dart VM 之前是针对吞吐量进行的优化,但团队现在正在针对延迟进行优化,这对于解决 Flutter 的工作负载更为重要。

在评估时,Dart 在以下主要标准上得分很高:

开发者的生产力。Flutter 的主要价值之一就是让开发者能使用相同的代码库为 iOS 和 Android 创建应用,以便节省开发资源。使用高效率的语言可以进一步提升开发者的工作效率,使 Flutter 更具吸引力。这对我们的框架开发团队和最终开发者来说都非常重要。Flutter 的大部分内容所使用的语言都与我们为开发者提供的语言相同,因此我们需要在数十万行的代码中保持高效率,同时避免牺牲我们开发出来的框架和 widget 的亲和力以及可读性。

面向对象。对于 Flutter 而言,我们需要一种适合其问题域——创建可视化用户体验——的语言。这个领域中沉淀了数十年的面向对象构建 UI 框架的经验。虽然我们可以使用非面向对象语言,但这意味着,为了解决几个难题,我们要 "重新发明轮子"。此外,绝大多数开发者都拥有面向对象开发的经验,因此可以更轻松地学习如何使用 Flutter 进行开发。

稳定可期的高性能表现。我们希望开发者能够通过 Flutter 创建快速而流畅的用户体验。为了实现这一点,我们需要能够在每个动画帧期间运行大量的最终开发者代码。这意味着我们需要的语言一方面既要拥有高性能,另一方面又需要避免因周期性的中断而影响帧率,即 "可期性"。

快速内存分配。Flutter 框架使用的函数式流程,很大程度上依赖于下层的内存分配器高效地对小型的、短生命周期的内容进行内存分配。这个流程是使用支持这种分配机制的语言进行开发的,在缺少这个机制的语言中无法有效运作。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q10:Flutter 能运行任何 Dart 代码吗?

Flutter 应该能够运行大多数没有引用 dart:mirrors 或 dart:html (不论是直接还是间接引用) 的 Dart 代码。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q11:Flutter 引擎有多大?

在 2018 年 12 月,我们实测了一个最简版本的 Flutter 应用 (即不含 Material 组件,只包含一个使用 flutter build apk 构建的 Center widget) 的下载体积 ,这个经过打包和压缩处理的 APK 大约为 4.06 MB。

对于这个最简应用,核心引擎体积约为 2.7 MB (压缩后),框架 + 应用代码体积约为 820.6 KB (压缩后),LICENSE 文件体积为 53.5 KB (压缩后),必要的 Java 代码 (classes.dex) 体积为 61.8 KB (压缩后),并且有大约 450.4 KB的 ICU 数据 (压缩后)。

这些数字是由 Android Studio 内置的 apkanalyzer 实测得出。

在 iOS 平台上,跟据 App Store Connect 的数据,同一应用的发布 IPA 在 iPhone X 上的下载文件体积为 10.8 MB。IPA 比 APK 大,主要是因为 Apple 加密了 IPA 中的二进制文件,使得压缩效率降低。

当然,您的实际情况可能跟我们所说的有所不同,我们建议您测量自己的应用的体积。想要测量 Android 应用体积,请运行 flutter build apk,并将 APK (build/app/outputs/apk/release/app-release.apk) 加载到 Android Studio 中,以便获取详细的体积报告。想要测量 iOS 应用,请将发布 IPA 加载到 App Store Connect 并获取体积报告。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q12:Flutter SDK 里有什么?

高度优化的针对移动应用的 2D 渲染引擎,更具备出色的文字支持功能

现代化的 react 风格框架

适用于 Android 和 iOS 的丰富 Widget

用于单元和集成测试的 API

用于连接系统和第三方 SDK 的互操作及插件 API

无界面 (headless) 测试运行器,用于在 Windows、Linux 和 Mac 上运行测试

命令行工具,用于创建、构建、测试和编译应用

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q13:用 Flutter 开发时可以使用哪些编辑器或 IDE ?

可以通过插件的方式使用 Android Studio、IntelliJ IDEA 和 VS Code 进行 Flutter 开发。

  1. 有关设置的详细信息,请参阅编辑器配置文档

https://flutter.io/docs/get-started/editor

  1. 有关具体的使用技巧,请参阅 "如何在 IDE 中开发 Flutter 应用"

https://flutter.io/docs/development/tools/android-studio

您也可以在命令行中使用 flutter 命令,并配合能编辑 Dart 语言的编辑器进行开发。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q14:Flutter 里存在开发框架吗?

是的,Flutter 自带了现代化的开发框架,灵感正是来自 React。Flutter 的框架旨在实现分层、可定制 (以及灵活的开发选项)。开发者可以选择仅使用框架的一部分,或是使用另外的框架。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q15:Flutter 里存在 Widget 吗?

是的,Flutter 自带了一套高品质的 Material Design 和 Cupertino (iOS 风格) Widget、布局和主题。当然,这些 Widget 只是一个起点。Flutter 的设计目的就是,让您轻松创建自己的 Widget,或是定制现有的 Widget。

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q16:Flutter 支持 Material 主题定制 (Theming) 吗?

是的,Flutter 和 Material 团队密切合作,完全支持 Material Theming。

通过 codelab 了解 Material 组件 (MDC) 主题定制:
https://codelabs.developers.google.com/codelabs/mdc-103-flutter

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q17: Flutter 带有测试框架吗?

是的,Flutter 提供用于编写单元和集成测试的 API。我们使用自己的测试功能来测试我们的 SDK,每次提交代码前我们都会测量提交的测试覆盖率。

了解更多有关 Flutter 测试的信息:https://flutter.io/docs/testing

@suhao
Copy link
Member Author

suhao commented May 5, 2019

Q18:Flutter 是否带有依赖注入 (dependency injection) 的框架或解决方案?

现在还没有。如果您有这方面的建议,请通过 flutter-dev@googlegroups.com 邮箱与开发者联系。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant