Flutter简介

这是Flutter项目主页上对Flutter的定义,它可以轻松、快速地构建漂亮的移动应用。

Flutter是Google使用Dart语言开发的移动应用开发框架,使用一套Dart代码就能构建高性能、高保真的iOS和Android应用程序,并且在排版、图标、滚动、点击等方面实现零差异。

像大部分的应用开发框架一样,在新建一个Flutter项目时,会有一个默认的main.dart文件,此时将项目编译运行在iOS与Android真机设备中,效果就像上面的图片所展示的那样。
实现跨平台
Flutter不是黑科技,应用程序的代码总是以一种非常合理,可以解释的方式的运行着,只是需要去了解而已。Flutter能够在iOS和Android上运行起来,依靠的是一个叫Flutter Engine的虚拟机,Flutter Engine是Flutter应用程序的运行环境,开发人员可以通过Flutter框架和API在内部进行交互。

Flutter Engine使用C/C++编写,具有低延迟输入和高帧速率的特点。关注AR/VR的人应该都知道,AR/VR对延迟和帧速率的要求比传统游戏要高得多,因为它们要求在用户在移动时保持真实世界的稳定性。因此笔者认为Flutter在未来的应用与发展中会占有一席之地。

接下来以Android平台为例,简单的介绍一下Flutter的原理,有Android开发经验的人都知道,Android应用程序是运行在Dalvik虚拟机里面的,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例,但是Flutter应用程序不使用Dalvik虚拟机。

以一个Flutter项目为例,当项目编译成Android后,生成的安装包大约23M。常规的Android应用程序安装包大多都能控制在10M以内,为什么Flutter项目编译的Android安装包要23M呢?通过使用Android Studio打开该安装包查看,上面的图片是Android Studio显示的结果。

通过观察安装包的内容,可以发现lib目录的大小约为48M,所以安装包庞大的主因就在lib目录。lib目录下包含x86_64、x86和armeabi-v7a三种CPU类型的指令集,由此可见,Flutter编译的Android应用程序自带独立的虚拟机,也就是上面提到的Flutter Engine。

Flutter编译的iOS应用程序采取的方案是,使用iOS运行时(Runtime)实现跨平台,iOS运行时(Runtime)是一个用汇编写的一段程序,可以执行C/C++编译的二进制。iOS原生开发的Objective-C语言也是通过iOS运行时(Runtime)执行C/C++的二进制文件,所以Flutter编译的iOS应用能和原生应用不相上下。

2017年的Google发布会上,Google简单介绍了正在研发中的操作系统Fuchsia,另有消息称,该系统的UI用户界面层使用的是Dart语言开发的Flutter框架,笔者相信该消息是真实的,因为在开发Flutter项目的过程中,使用获取当前平台类型方法时,可选项目中除了iOS和Android,还包含Fuchsia,如下图所示。

因此,笔者大胆推测Flutter框架实现跨平台的原理,在Fuchsia系统中已经包含Flutter Engine虚拟机,可以直接可以运行Flutter应用程序,Android和iOS系统则是在程序包中内置Flutter Engine虚拟机以运行Flutter应用程序。

框架结构
下面的图片是Flutter框架结构图,对大部分开发者而言,最常用的是Widgets层,屏幕上可见与不可见的元素都由Widgets层实现,这些元素被称为Widget。在Widgets层在上层,有两个现成的Widget库,Material库即Material Design的Widget库,Material Design是Google I/O 2014发布的设计语言,目前成为统一Android Mobile、Android Table、Desktop Chrome等平台的设计语言规范。Cupertino库则是一个模仿iOS设计风格的Widget库。

Flutter框架结构图的底层是Flutter Engine虚拟机,在这一层次中需要了解一下的是Skia,Skia是Google研发的包括图形、文本、图像、动画等多方面的图形引擎,不仅用于Google Chrome浏览器,Android系统也采用Skia作为绘图处理引擎。

上面的图片展示了Flutter的绘图原理,Flutter框架直接使用Skia引擎来渲染,因此能够控制渲染帧数,从而实现高帧速率。

posted @ 2019-08-28 15:25  NingSpeals  阅读(241)  评论(0编辑  收藏  举报