Flutter 开发者,这 11 个问答知识点,让你的编程之路更加顺畅 ...

0
回复
123
查看
[复制链接]

388

主题

389

帖子

4726

安币

手工艺人

发表于 2019-4-30 11:05:01 | 显示全部楼层 |阅读模式
如果对本篇文章感兴趣,请前往,原文地址:http://www.apkbus.com/blog-865069-79977.html

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

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



问题 2: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)。
问题 3:Flutter 如何在 iOS 上运行我的代码?

引擎的 C 和 C   代码使用 LLVM 编译。Dart 代码 (SDK 的和您的) 都是预先 (ahead-of-time, AOT) 编译成本地 ARM 库。这些库被包含在一个 iOS "runner" 项目中,然后整套内容被编译成一个 .ipa。当应用启动时,它会加载 Flutter 库。任何渲染、输入或事件处理等都会 delegate 给编译好的 Flutter 和应用代码。这个工作机制与很多游戏引擎颇为相似。
调试模式时则使用虚拟机 (VM) 来运行 Dart 代码 (因此这时会显示 "Debug" 字样,以提醒开发者速度会稍微变慢),这样便可以启用有状态热重载 (Stateful Hot Reload)。
问题 4:Flutter 是否会使用系统的 OEM widget?

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

  • 浏览 Flutter widget 目录
  • https://flutter.dev/docs/development/ui/widgets
我们希望最终能够产生出更高质量的应用。如果我们直接使用 OEM 自带的 widget,那么 Flutter 应用的质量和性能将受到这些 widget 质量的限制。
例如,在 Android 中,有一组硬编码的手势和固定的计算规则来区别它们。在 Flutter 中,您可以编写自己的手势识别器,它在手势系统中拥有最高的优先级。此外,由不同人创作的两个 widget 可以进行协调,以便消除手势的歧义。

  • 手势系统
  • https://flutter.dev/docs/development/ui/advanced/gestures
如今的应用设计趋势表明,很多设计师和用户都需要动效丰富的 UI,同时富有品牌表现力。为了实现这种级别的美学定制化设计,Flutter 在架构上就会倾向于直接驱动像素,而不是交给 OEM widget 来处理。
由于使用相同的渲染器、框架和 widget,就意味着您能更加轻松地同时发布 iOS 和 Android 版本应用,而无需耗费精力和成本来规划和同步两套独立的代码库和功能集。
另外,使用单一的语言、单个框架和同一组适用于所有 UI 的库 (无论您的 UI 在每个移动平台上都各有不同还是基本一致),也有助于帮助您降低应用开发和维护成本。
问题 5:我的移动 OS 更新并加入新的 widget 时会怎么样?

Flutter 团队密切关注来自 iOS 和 Android 的 widget 使用和需求情况,且会与社区合作,对新的 widget 提供构建支持。这些支持可能会以这些形式来提供给开发者: 较低层级的框架功能、新的可编辑组合的 widget,或全新的 widget 实现。
Flutter 的分层架构旨在支持众多 widget 库,我们鼓励并支持社区构建和维护 widget 库。
问题 6:我的移动 OS 更新并加入新的平台功能时会怎么样?

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

Flutter 支持使用 Linux、Mac 和 Windows 进行开发。
问题 8:Flutter 是用哪种语言写成的?

我们对比了很多开发语言和运行时,并最终采用了 Dart 来编写框架和 widget。底层图形框架和 Dart 虚拟机在 C/C   中实现。
问题 9: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 框架使用的函数式流程,很大程度上依赖于下层的内存分配器高效地对小型的、短生命周期的内容进行内存分配。这个流程是使用支持这种分配机制的语言进行开发的,在缺少这个机制的语言中无法有效运作。
问题 10:Flutter 能运行任何 Dart 代码吗?

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

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

  • GitHub 上的最简应用
  • https://github.com/flutter/flutter/tree/75228a59dacc24f617272f7759677e242bbf74ec/examples/hello_world
对于这个最简应用,核心引擎体积约为 2.7 MB (压缩后),框架   应用代码体积约为 820.6 KB (压缩后),LICENSE 文件体积为 53.5 KB (压缩后),必要的 Java 代码 (classes.dex) 体积为 61.8 KB (压缩后),并且有大约 450.4 KB的 ICU 数据 (压缩后)。
这些数字是由 Android Studio 内置的 apkanalyzer 实测得出。

  • apkanalyzer
  • https://developer.android.google.cn/studio/command-line/apkanalyzer
在 iOS 平台上,跟据 App Store Connect 的数据,同一应用的发布 IPA 在 iPhone X 上的下载文件体积为 10.8 MB。IPA 比 APK 大,主要是因为 Apple 加密了 IPA 中的二进制文件,使得压缩效率降低。

  • iOS App Store Specific Considerations - 关于加密
  • https://developer.apple.com/library/archive/qa/qa1795/_index.html#//apple_ref/doc/uid/DTS40014195-CH1-APP_STORE_CONSIDERATIONS
当然,您的实际情况可能跟我们所说的有所不同,我们建议您测量自己的应用的体积。想要测量 Android 应用体积,请运行 flutter build apk,并将 APK (build/app/outputs/apk/release/app-release.apk) 加载到 Android Studio 中,以便获取详细的体积报告。想要测量 iOS 应用,请将发布 IPA 加载到 App Store Connect 并获取体积报告。

  • 使用 Android Studio 加载 APK(https://developer.android.google.cn/studio/build/apk-analyzer)
  • 使用 App Store Connect 加载 IPA(https://flutter.dev/docs/deployment/ios)
  继续阅读全文



想在安卓巴士找到更多优质博文,可移步博客区

如果对本篇文章感兴趣,请前往,
原文地址:
http://www.apkbus.com/blog-865069-79977.html
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

领先的中文移动开发者社区
18620764416
7*24全天服务
意见反馈:1294855032@qq.com

扫一扫关注我们

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粤ICP备15117877号 )