Flutter查漏补缺2
Flutter的理念架构
Flutter架构分为三层
- Framework层(dart)
- flutter engine层(C/C++)
- embeder层(platform-specific)

Flutter 被设计为一个可扩展的分层系统。它可以被看作是各个独立的组件的系列合集,上层组件各自依赖下层组件。组件无法越权访问更底层的内容,并且框架层中的各个部分都是可选且可替代的。
Framework层
是由dart编写的sdk,实现了一套基础库,包含了material和Cupertino风格UI界面,下面是一些通用的widget组件,渲染,动画,绘制,手势库等等。这个纯dart实现的库被封装为dart:ui。
Flutter engine层
Flutter引擎是Flutter的核心,主要使用C++编写。它提供了Flutter 核心API底层实现,包括图形渲染(通过Skia)、文本布局、文件以及网络IO(Input/Output ==> 内部与外部的通信)、辅助功能支持、插件架构和Dart运行环境及编译环境的工具链。引擎将底层C++代码包装成Dart代码,通过dart:ui暴露给Flutter框架层。
Skia是Google的一个2D绘图引擎库,Chrome和Android均采用Skia作为绘图引擎,在图形转换、文字渲染、位图渲染方面提供了友好、高效的表现。Skia是跨平台的,可以被嵌入到Flutter的IOS SDK中,而不用去研究IOS闭源的Core Graphics / Core Animation。Android自带了Skia,所以Flutter Android SDK比IOS SDK小的多。
Embeder层
为engine层提供了四个task runner,将引擎移植到平台的中间层代码,渲染设置,原生插件,线程管理,事件循环交互等操作。这一层是操作系统适配层,负责管理线程。
Flutter是如何做到一套Dart代码可以编译运行在Android和iOS平台的
Skia引擎渲染,实现多平台渲染一致性
Method Channel机制
为了解决调用原生系统底层能力以及相关代码库复用问题,Flutter为开发者提供了一个轻量级的解决方案,即逻辑层的方法通道(Method Channel)机制。基于方法通过,我们可以将原生代码所拥有的能力以接口的形式暴露给Dart,从而实现Dart代码和原生代码的交互,就像调用了一个普通的Dart API一样。
注意 Method Channel时非线程安全的。原生代码在处理方法调用请求时,如果涉及到异步或者非主线程切换,需要确保回调过程是在原生系统的UI线程中执行的,否则应用可能会出现奇怪的Bug,甚至是Crash。
关于Platform channel
三种类型
- BasicMessageChannel:用于传递字符串和半结构化的信息
- MethodChannel:用于传递方法调用(method invocation)
- EventChannel:用于数据流(event streams)的通信
成员变量
三种Channel之间互相独立,各有用途,但它们在设计上却非常相近。每种Channel均有三个重要成员变量
- name: String类型,代表Channel的名字,也是其唯一标识符。
- messager:BinaryMessenger类型,代表消息信使,是消息的发送与接收的工具。
- codec: MessageCodec类型或MethodCodec类型,代表消息的编解码器。
如何让Flutter编译出来的APP的包大小尽可能变小
Flutter release产物分析

整个APP由APP Framework和Flutter Framework两部分组成
- APP Framework(可变化的)
- App:Dart代码AOT编译产物,是动态链接库
- flutter_assets:Flutter静态资源文件夹,包括图片,字体等
包体积优化方法
删、缩、挪
- 删:删除无用代码,无用资源。可以手动删除,也可以机器删除,也可以编译时删除。Flutter有一个Tree shaking机制,从Main方法开始,逐级引用,最终没有被引用的代码,诸如类和函数都会被裁减掉。这个就是编译时自动删除。
- 缩:比如压缩图片资源。
- 挪:从项目工程或Packages里直接挪到远端,典型是远端下发插件或者安卓里的App Bundle,虽然“挪”对性能来说是有损的(需要动态下发),但是包体积却大大减少。
移除无用代码和无用资源,压缩图片,安卓里拆App bundle
统一编译参数
在Flutter引擎编译时,安卓和IOS的编译参数不同,安卓时-OZ,IOS时-OS,想追求极致包体积的话,是需要使用-OZ的。升级到最新的build-tools,改OS为OZ
动态下发方案
Flutter工程编译安卓包,会编译成4个snapshot文件,分别是
- isolate_snapshot_instr
- isolate_snapshot_data
- vm_snapshot_instr
- vm_snapshot_data
把isolate_snapshot_data和vm_snapshot_data文件移出来,flutter_assets也移出来。挪动前9.2M,挪动后3.8M,如果App体积庞大,这个收益会更明显。
Flutter渲染优化
重建组件个数尽量少
如果将整个页面写在一个单独的StatefulWidget中,每次setState都会导致不必要的UI重建。拆分组件,使用良好的设计模式和状态管理方案。
构建组件时使用const关键词,可以抑制widget的重建
合理利用const关键词,可以在很大程度上优化应用的性能
需要注意以下两点
- 当const修饰类的构造函数时,要求该类的所有成员必须是final的。适合StatelessWidget。
- const变量只能在定义的时候初始化
有些实现的效果背后可能会使用saveLayer()这个代价很大的方法
- ShaderMask
- ColorFilter
- Chip,当disabledColorAlpha!=0xff时,会调用saveLayer()
- Text,如果有overflowShader,可能调用saveLayer()
官方优化点
由于Opacity会使用屏幕外缓冲区,因此能不用Opacity Widget就尽量不要用。有关透明度应用于图像的示例,请参见Transparent image,比Opacity widget更快,性能更好。
可以通过设置颜色的透明程度,比如Color.fromRGBO(255, 0, 0, 0.5)
Clipping不会调用saveLayer()(除非明确使用Clip.antiAliasWithSaveLayer),因此这些操作没有Opacity那么耗时,但仍旧很耗时,请谨慎使用。
管理着色器编译垃圾
有时候,应用中的动画首次运行会看起来非常卡顿,但是运行多次之后便可以正常运行,这可能就是由于着色器编译混乱导致的。
在不同的平台上,可以执行以下命令,使用SkSL预热功能构建应用程序:
安卓
flutter build apk — bundle-sksl-path flutter_01.sksl.json
IOS
flutter build ios --bundle-sksl-path flutter_01.sksl.json
Flutter查漏补缺2的更多相关文章
- Flutter查漏补缺1
Flutter 基础知识查漏补缺 Hot reload原理 热重载分为这几个步骤 扫描项目改动:检查是否有新增,删除或者改动,直到找到上次编译后发生改变的dart代码 增量编译:找到改变的dart代码 ...
- 《CSS权威指南》基础复习+查漏补缺
前几天被朋友问到几个CSS问题,讲道理么,接触CSS是从大一开始的,也算有3年半了,总是觉得自己对css算是熟悉的了.然而还是被几个问题弄的"一脸懵逼"... 然后又是刚入职新公司 ...
- js基础查漏补缺(更新)
js基础查漏补缺: 1. NaN != NaN: 复制数组可以用slice: 数组的sort.reverse等方法都会改变自身: Map是一组键值对的结构,Set是key的集合: Array.Map. ...
- Entity Framework 查漏补缺 (一)
明确EF建立的数据库和对象之间的关系 EF也是一种ORM技术框架, 将对象模型和关系型数据库的数据结构对应起来,开发人员不在利用sql去操作数据相关结构和数据.以下是EF建立的数据库和对象之间关系 关 ...
- 2019Java查漏补缺(一)
看到一个总结的知识: 感觉很全面的知识梳理,自己在github上总结了计算机网络笔记就很累了,猜想思维导图的方式一定花费了作者很大的精力,特共享出来.原文:java基础思维导图 自己学习的查漏补缺如下 ...
- 20165223 week1测试查漏补缺
week1查漏补缺 经过第一周的学习后,在蓝墨云班课上做了一套31道题的小测试,下面是对测试题中遇到的错误的分析和总结: 一.背记题 不属于Java后继技术的是? Ptyhon Java后继技术有? ...
- 今天開始慢下脚步,開始ios技术知识的查漏补缺。
从2014.6.30 開始工作算起. 如今已经是第416天了.不止不觉.时间过的真快. 通过对之前工作的总结.发现,你的知识面.会决定你面对问题时的态度.过程和结果. 简单来讲.知识面拓展了,你才干有 ...
- Mysql查漏补缺笔记
目录 查漏补缺笔记2019/05/19 文件格式后缀 丢失修改,脏读,不可重复读 超键,候选键,主键 构S(Stmcture)/完整性I(Integrity)/数据操纵M(Malippulation) ...
- 【spring源码分析】IOC容器初始化——查漏补缺(四)
前言:在前几篇查漏补缺中,其实我们已经涉及到bean生命周期了,本篇内容进行详细分析. 首先看bean实例化过程: 分析: bean实例化开始后 注入对象属性后(前面IOC初始化十几篇文章). 检查激 ...
- Django 查漏补缺
Django 查漏补缺 Django 内容回顾: 一. Http 请求本质: 网络传输,运用socket Django程序: socket 服务端 a. 服务端监听IP和端口 b. 浏览器发送请求 ...
随机推荐
- 【赵渝强老师】Weblogic域和域的组成
一.什么是Weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于Java EE架构的中间件,WebLogic是用于开发.集成.部署和 ...
- USB configfs与USB functionfs的区别及关系
configfs 和 functionfs 是 Linux 内核中用于配置和管理 USB 设备行为的两种不同的文件系统,它们各自的用途和工作方式有所不同,但在 USB Gadget 子系统中可以结合使 ...
- linux overlay文件系统
一个 overlay 文件系统包含两个文件系统,一个 upper 文件系统和一个 lower 文件系统,是一种新型的联合文件系统.overlay是"覆盖-上面"的意思,overla ...
- 什么是WebRTC
背景:webrtc web real-time communication 实时通信标准,提供了音视频通话系统的能力. 应用场景: 点对点视频聊天,如 微信视频,等实时视频通话应用. 多人视频会议,企 ...
- threejs - js库 gui 的使用 调试开发3D效果
// 导入 threejs import * as THREE from "three"; import { OrbitControls } from "three/ex ...
- document.write 和 innerHTML 的区别
a document.write 是整个页面的内容,会重写页面b innerHTML 是某个元素的内容,只有给body的innerHTML设置内容才会重写页面
- linux 基础(5)文件的打包和压缩
文件的压缩是非常重要和常见的操作. 在 Windows 下,zip 和 rar 经常使用的压缩软件,框选一堆文件,右键用 WinRAR 就可以完成压缩.不过在 linux 下通常不这么做.一是因为 l ...
- ROS入门21讲(2)
四.创建工作空间与功能包 1.工作空间 工作空间(workspace):是一个存放工程开发相关文件的文件夹(相当于在IDE中创建的工程文件). 包含: src:代码空间(Source Space),放 ...
- Python实现摇号系统
1.引言 摇号系统在现代社会中有广泛的应用,特别是在车牌摇号.房屋摇号等公共资源分配领域.摇号系统的主要目的是通过随机分配的方式,确保资源的公平.公正分配.本文将详细介绍如何使用Python实现一个简 ...
- 如何解决MySQL Connector NET xxxx无法卸载的问题(win10)
使用Power BI(以下简称PBI)的小伙伴想必都知道,想要在PBI连接MySQL数据库,必须安装MySQL connector net,我之前安装过MySQL connector net 6.9. ...