内容简介:Flutter是Google新出的跨平台开发框架,目前国内外已经有许多产品将Flutter用到正式的生产环境,本文用Flutter实现了一个瀑布流的动态页面。废话不多说,先上图,如下是分别用natvie和Flutter开发的页面:
Flutter是Google新出的跨平台开发框架,目前国内外已经有许多产品将Flutter用到正式的生产环境,本文用Flutter实现了一个瀑布流的动态页面。
动态页
1、页面效果
废话不多说,先上图,如下是分别用natvie和Flutter开发的页面:
左边是Native页面,右边是Flutter页面,可以看到Flutter的UI与natvie的几乎没有差别,但是Flutter并不像RN一样使用Native的UI进行绘制,而是在Canvas上自己绘制,可以从如下的视图层级图中看出:
2、跨平台覆盖率
Flutter支持Android和iOS:
1. Android支持4.1及以上的版本,设备要求是arm cpu 2. iOS支持 iOS8及以上,设备是iPhone 4S及以上 复制代码
官网上的描述如下:
- 结论 Flutter对Android和iOS的支持基本上已经覆盖了市场上的绝大部分用户。
3、开发成本
- 适配层代码量小 Flutter是以Native作为出发点,在平台画布(Canvas)上构建一套独立的绘制体系,独立进行绘制和渲染,再通过粘合层抹平平台差异,达到接近原生程序体验的前提下的跨平台框架。因为Flutter有自己独立的绘制体系,因此相对于React Native和Weex来讲,对Native的依赖更小,所以Flutter和Native之间适配层的代码量很少,Flutter里面适配层的代码都是用于数据的传输。
- Dart语言开发 同时Flutter使用Dart语言开发,Dart本身的高效特性可节约大量的开发成本。
这里列出开发同一个页面,native和Flutter的代码量:
| native | Flutter | |
|---|---|---|
| 代码量 | 1346 | 668 |
4、包大小
Flutter 主要包含三部分,分别是:
1. sdk大小:so库(Android)/Framework(iOS) 2. Dart代码的构建产物(Android和iOS) 3. Channel 层的Android代码(iOS这部分在构建产物中) 4. 资源文件 复制代码
Flutter为了性能和调试方便,在debug模式和release模式下的编译方式不同,导致so库和构建产物的大小相差很大,并且Flutter页面越复杂,构建产物的大小越大,其中
1. 在debug模式下,so库打入了x86_64、x86、arm64-v8a,总共22.28M,构建产物大小8.94M,总共31.2M 2. 在release模式下,so库只有armeabi-v7a,总共3.46M,构建产物大小4.19M,总共7.65M 复制代码
而我们集成进工程的都是release模式,所以包大小至少增加7.65M,以下是Flutter、React Natvie、Weex包大小的比较:
| Flutter | React Native | Weex | |
|---|---|---|---|
| 大小 | >7.65M | 5M | 8.15M |
- 结论 Flutter的so库及jar包的大小其实和React Native、Weex相差不大,甚至还要小一些,但是由于Flutter与React Native、Weex的实现方式不同,用Flutter写的页面的构建产物会打入到APP里面,从而导致Flutter集成到APP里面的大小要大一些,而且页面越复杂,构建产物的大小越大。
5、内存
往下滑动列表,记录页面内存的使用情况
- 在native页面中,Java内存、Native内存、Graphics内存都在增长
- 在Flutter页面中,Java内存、Native内存几乎不变,只有Graphics内存在增长,在官网上可以查到对Graphics内存的解释:
从这里可以看出,Flutter使用的内存不是 Java 内存,虽然Graphics内存使用的很多,但是几乎不会增加Java内存的使用量,这对于我们来说是一个好消息,不会担心OOM的问题。
- 结论 因为Flutter使用的内存不是Java内存,所以不会导致OOM。
6、首屏时间
首屏时间:页面打开,拉取数据,到第一帧显示出来的时间。
| native | Flutter | |
|---|---|---|
| 首屏时间(ms) | 284.69 | 372.92 |
- 结论 Flutter首屏时间要慢于natvie页面,慢100ms左右,Flutter首次的渲染速度还是略慢,之后的渲染速度就很快了。
7、页面的流畅度
往下滑动列表,统计页面的FPS,监测页面的流畅度。
| native | Flutter | |
|---|---|---|
| FPS | 50 | 55 |
- 结论 在滑动时,Flutter的流畅度比native要好一些。
8、 Flutter引擎crash率
截止到2018.6.16号,以下是RDM上报的Flutter相关的Crash数据:
| 错误类型 | 上报次数 | 影响用户 | 影响设备 |
|---|---|---|---|
| java.lang.NumberFormatException | 199 | 132 | 192 |
| SIGBUS(BUS_ADRERR) | 94 | 5 | 6 |
| SIGABRT | 2 | 2 | 1 |
| SIGSEGV(SEGV_MAPERR) | 3 | 2 | 1 |
| 总共 | 298 | 141 | 200 |
上报的Flutter成功初始化的次数总共是6896796次,crash率只有0.005%
- 结论 可以看到Flutter的crash情况是特别少的,crash率只有0.005%,说明Flutter引擎很稳定。
###9、Flutter页面异常情况 截止到2018.6.16号,监测到Flutter页面总共打开3172次,其中上报的error总共有19个,这些error都是Flutter Framework层的问题,Flutter页面出现error,不会造成crash,但有可能会造成页面异常,比如无法滑动或无法交互等。
| 打开次数 | 页面出现error的次数 | error率 | |
|---|---|---|---|
| Fluter页面 | 3172 | 19 | 0.59% |
- 结论 上报的error都是Flutter Framework层的问题,但是一方面出错的概率很小,另一方面Flutter Framework层都是用Dart来实现,而且更重要的一点是Framework层对于我们来说是白箱的,我们可以直接修改Framework层的代码,也意味着我们可以做更加深入的优化。
Flutter工程化实践
1、cs协议数据获取
因为数据都是通过cs协议来拉取的,而在Flutter层实现一个cs的拉取,还需要管理登录态,实在是一个复杂的事情,好在Flutter有与Native通信的机制,但是Flutter与Native通信只能传基本类型,不能直接传对象,传输支持的类型如下图:
那怎么把cs数据从Native传给Flutter呢?好在Dart支持pb,我们可以把要使用的pb文件,编译成Dart代码,在Dart层组装好pb的request并转化为byte传给Native,在Natvie层发送cs协议,接受到byte格式的数据,在发送给Flutter,Flutter把byte在转化为对象使用。如下图:
pb编译成Dart代码如下图:
2、iOS上crash问题
在开发过程中,当一直下拉拖动列表加载更多时,iOS很容易crash,crash日志如下:
经过分析发现原来是在下拉加载更多的时候,一直在加载图片,导致OOM。
于是去分析Flutter的图片加载机制,发现Flutter虽然提供了一个ImageCache来缓存加载的图片,但他只能粗略的指定最大缓存图片张数,不能精确的使用内存大小来设定缓存池容量,而且更坑的是在加载图片的时候不能裁剪图片尺寸,都是以原尺寸来加载图片,查遍所有资料,也没有看到Dart层能对图片进行裁剪的方法,而我们瀑布流里面的图片都是大图,所以导致在下拉加载更多的额时候,iOS的内存使用量一直在增加,最终导致OOM。
知道Flutter图片缓存策略太简单、以及不能对图片裁剪的问题后,接着就对Flutter的图片加载机制做了如下改造,Flutter拿到图片的url之后,自己不去加载,而是将url交给natvie处理,使用native的图片库将图片下载并裁剪尺寸保存在本地,然后把图片在本地的地址传给Flutter加载,成功解决了Flutter在iOS上的crash问题。流程图如下:
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Redis 实现发布订阅原理与实践
- GAN入门实践(二)--Pytorch实现
- GAN入门实践(一)--Tensorflow实现
- Proxy实现vue MVVM实践
- 应用XGboost实现多分类模型实践
- [实践总结]纯css实现动态边框
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
XML Hacks
Michael Fitzgerald / O'Reilly Media, Inc. / 2004-07-27 / USD 24.95
Developers and system administrators alike are uncovering the true power of XML, the Extensible Markup Language that enables data to be sent over the Internet from one computer platform to another or ......一起来看看 《XML Hacks》 这本书的介绍吧!