flutter打包的app有多大_前端大势所趋---Flutter 这篇文章会让你行动起来

Flutter和原生APP的性能对比

前言

自从今年google IO大会推出flutter跨平台开发框架以来,flutter在各个技术论坛里被吵得如日中天。flutter团队直言flutter可以帮助开发者轻松实现恒定60fps的性能体验。
我们知道flutter跨平台的原理是采用dart语言预编译的方式直接编译出各个平台的原生代码,而不需要类似RN用JavaScript桥接器执行原生代码。那么这样做的性能究竟如何呢?是否能达到和原生一样的流畅度,是否如官方所说达到恒定60fps的性能体验?今天我们就以android为例从几个不同的维度来实际测试一下!

安装包对比

我们分别用 flutter 和 android 原生来编写一个ui效果一模一样的 apk,然后打出 release 版本的安装包,为了保证测试结果的可靠性,我们不引入任何第三方库,只用框架提供的控件做一些简单ui,这里附上demo源码:flutter demo,android demo。好了,我们打出各自的release版本apk,然后使用AndroidStudio自带的APK Analyzer进行分析,如下图:

099d97f0a73fd214c4461f6472ceeb2d.png

android原生apk

d458f9a6de5e721890da9ef705446e09.png

flutter apk

  • apk 大小
    可以明确的看出来,原生的安装包要比 flutter 安装包小约 6M 左右。
  • classes.dex 大小
    看 dex 大小你会不会很奇怪,原生的 classes.dex 竟然比 flutter 版的dex大六百多KB,这是因为原生的 dex 里引入了 support 库和各种基础控件(ImageView TextView等等),而 flutter 的 dex 里面没有support库,也没有原生控件,实际上 flutter 实现了一套自己的控件,包括 Material Design 和 Cupertino(iOS风格的widget)。
  • res 对比
    可以看到原生的资源文件要比 flutter 大约200多k,而我们项目中没有编写任何资源文件,所以这些资源文件大多是 support 包和 sdk 自带的。
  • lib 库
    大家可能会发现,我们的 flutter 版 app 多出了一个 lib 库,打开里边是一个 libflutter.so,因为 Flutter 引擎是用 C、C++ 来编写的,在 android 上会使用 ndk 编译,在 iOS 上使用 LLVM 编译,而我们自己写的 dart 代码会通过 AOT 编译成各个平台的本地代码。

通过对比我们了解到,flutter 版的 apk 大小会比 android 原生的多出约 6M 左右,其中核心引擎大约 3.2MB,框架+应用程序代码大约是 1.25MB,必需的 Java 代码 .dex 将近 60k,而 assets 文件里还约有 2.1MB 的 ICU 数据等,单纯从安装包上来说,原生是要优于 flutter 的。

运行性能测试

为了测试覆盖更加充分,我们分别在 debug 和 release 模式上进行性能测试。而据官方介绍 flutter 的 debug 模式在性能上是要略于 release 版的,所以他们提供了 profile 模式供我们测试,profile 模式编译和启动 Flutter 应用程序几乎与 release 模式完全相同。
我们先看 android 原生的 debug 和 flutter 的 proflle 模式性能对比,这里我们用 Android Profiler 进行性能指标检测,demo 只有一个界面,用 ListView 展示 10000 条数据。下面看图:

acc6a5653b498def822fddd2dfaf4983.png

android原生debug性能检测图

4ca6ec62b8dde50f1495cf7d59c9f164.png

flutter profile性能检测图

  • CPU资源占用
    首先,我们看 CPU 的占用,在启动的时候,android 原生对 cpu 的占用峰值在 26.8%,而且几乎是比较平稳的变化,而 flutter 对 cpu 的占用峰值达到了 35.5%,是一种很陡峭的形态,然后在大约十六七秒的时候,分别滑动了 listview, android 原生对 cpu 资源的占用峰值约 23%,而flutter约 22.5%。从图中也可以看得出,flutter 对 cpu 资源的占用是突然之间占用很高,而 android 则相对平稳一些。
  • 内存占用
    内存占用表现上两者都很相似,android 原生在启动时占用内存最高达到 58.1MB,而 flutter 则为 72MB,在滑动
    listview 的时候,两者表现也很一致,都没有突然出现很高的内存占用。达到稳定状态后,android 原生内存占用稳定在35MB,而 flutter 为 52.5MB。

debug 和profile 模式的性能测试如果你还不放心的话,那么下面我分别打包出用 flutter 和 android 原生构建出的release apk,然后将手机开启ROOT权限,以便可以用 Android Profiler 检测到这两个版本的进程,进行性能测试。下面看图:

71d698e96195dac10c192b9b64a3cd59.png

android原生性能检测图

60c00571b301a78b5f0091999fea4126.png

flutter 性能检测图

我在打开 app 并锁定当前进程后,分别在大约第 10 秒的时候,用手指轻轻滑动了 ListView,下面我们分析下两种方式的资源占用情况。

  • CPU资源占用
    首先,我们看 CPU 的占用,正常情况下,两者都没有占用多少 CPU 资源,当我滑动 listview 的时候,原生的大约会占用最高 7.7% 的 CPU 资源,而 flutter 版的则占用高一些,峰值大概在 18.8%。
  • 内存占用
    原生的app内存占用维持在 12M 左右,而 flutter 版的则维持在 21M 左右,原生应用比 flutter 大约低了 9M 的内存占用。

从上边两种模式的性能检测结果分析我们可以总结出,flutter 应用在 CPU 和内存的资源占用上会比原生方式多一些,所以单纯的从性能上来说,android 原生是肯定要优于 flutter 的,但是从用户体验上来说,两者的滑动同样顺畅无比,几乎感觉不到差别。

应用启动对比

启动是我们衡量一个应用程序性能的重要指标,下面我先通过一个 gif 来演示下 android 版和 flutter 版启动 app 的体验:

4d852e995271294e93a55a20e0abc421.gif

看得出,android 版和 flutter 版从启动体验上来说几乎不相上下。这里我大胆做一个猜测,flutter app的启动机制和原生还是一模一样,所以调用启动 Application 也是创建 ActivityThread 然后最终执行 Application 的 onCreate 方法,所以从启动上来说相差无几。下面我贴出 android 原生和 flutter 版的启动trance文件,

d93a5cc093385349282f7e0c78a5fdf8.png

android原生trance文件

5370fc876ad1113b9d61b62ef24546dc.png

flutter trance文件

trance 文件几乎一模一样,我一度都怀疑是自己弄错了,然后又仔细确认了一下没出错才放心,可以得出结论,flutter 版的启动流程跟原生是一模一样的。

flutter 60帧/秒的刷新率测试

Flutter 官方指出其旨在提供 60 帧/秒的刷新率,60 fps 意味着大约平均每 16 ms 渲染一帧。我们知道,当 UI 不能平滑的渲染时就会出现掉帧。举个例子,假如有一帧执行的东西太多,花费了 160 ms 的时间去渲染,这段期间就会产生丢帧现象,从而就会看到动画出现了明显的抖动。flutter release 版本是没法去测试渲染指数的,这里我们还是以 profile 模式运行,然后在用官方给我们提供的 Flutter Inspector 工具去展示 fps 变化。下面看 Gif 图:

b2fd2144947e9b7ae27a46553b0ad4e4.gif

我的手机是小米Note 2,高通骁龙821处理器 4G 内存,性能大概属于 Anroid 阵营中上等。我打开 app 后先是平稳的滑动 listview,然后又快速的滑动,由图可看出,刷新率起初恒定在 60fps,当我快速滑动的时候,刷新率大约保持在58~59 之间,所以 flutter 官方所说 fps 恒定在 60fps 还是可信的。

总结

通过以上的分析,我们可以很明确的得出结论,android 原生在内存、CPU 资源占用方面要低于 flutter,并且安装包的体积也要小于 flutter,所以,不考虑其他因素,单纯从性能角度来说,android 原生肯定是要优于 flutter 的。但 flutter 也有它的优点,比如跨平台的开发、毫秒级的热重载等等,另外跨端开发也逐渐的流行起来,所以,我们在学好android原生的基础上,对跨端开发也要抱有积极的心态。

参考

flutter中文网:https://flutterchina.club
flutter官网:https://flutter.io


喜欢小编的可以点个赞关注小编哦,小编每天都会给大家分享文章。

我自己是一名从事了多年的前端老程序员,小编为大家准备了新出的前端编程学习资料,免费分享给大家!

如果你也想学习前端,那么帮忙转发一下然后再关注小编后私信【1】可以得到我整理的这些前端资料了(私信方法:点击我头像进我主页有个上面有个私信按钮)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用java创建窗口程序,创建窗口的应用程序

创建窗口的应用程序通过前面的基础知识的学习,已经对ctypes库的基本功能学会了使用,为了加强这种知识训练,以及运用刚学习的知识的快乐,我们来创建一个稍稍复杂一点的应用程序。这个应用程序是所有后面应用程序的基础,…

python爬取b站排行榜_实时爬取B站排行榜并保存为表格——每周一个爬虫小教程系列...

从这周开始,每周来一个爬虫小教程,希望对你们有所帮助,这次的目标是B站排行榜至于爬取什么内容,目前感觉就把序号,名称以及评分爬取下来吧(因为我是边写教程边写代码的) 这次需要用到的知识&…

css 垂直居中_html中div使用CSS实现水平/垂直居中的多种方式

CSS中的居中,在工作中,会经常遇到。它可以分为水平居中和垂直居中,以下是几种实现居中的方式。以下例子中,涉及到的CSS属性值。.parent-frame { width: 200px; height: 200px; border: 1px solid red; } .child-frame { width…

php表白情话,朋友圈唯美表白短句情话 适合发朋友圈的情话

1、一个人经历了所有的苦难,也不要指望能和谁在一起;我曾经真诚的尝试过,但是结果我不想说。2、只要你愿意,只要我有,整个世界都是你的,而你只能是我的。3、只要你愿意,当你失落失意的时候&…

高德地图看各省分界线_深度解读|高德宣布高精地图“百元时代”背后的商业逻辑是什么...

车展前夕,高德的一次媒体沟通会,或许将为国内自动驾驶的发展带来深远影响。4月11日,高德地图在北京举行“高精宣言”媒体沟通会,表示将对高精地图服务进行升级,并以成本价格提供标准化高精地图,与合作伙伴分…

js获取ip地址_(原创)Node.JS实战31:大名鼎鼎的Express!

Express (http://expressjs.com)是Node.JS中一个简洁、灵活、强大的Web应用框架, 它提供了一系列强大特性,可以帮助我们快速创建各种Web 应用,也可用来编写各种的Web工具。Express博大精深,本文在此只做简单…

mysql跳过安全_Navicat连接MySQL数据库

前言:在使用Gin架构搭建博客的时候,需要设计数据库,以及连接数据库.命令端口操控效率实在是太低且不好管理,这个时候使用Navicat就能轻松高效的使用数据库了.步骤:下载安装Navicat,Mysql配置Mysql及其账号密码 Navicat连接Mysql1.下载安装Navicat,MysqlNavicat官网下载地址:…

java 切面_实用|AOP切面编程手段大汇总

点击上方"欧学长的架构成长之路" 关注我前言首先说一下什么是AOP?AOP就是面向切面编程,它是一个思想,通过切面,我们可以将那些反复出现的代码抽取出来,放在一个地方统一处理,提高代码的复用性。A…

php可以控制硬件吗,控制面板的作用是设置硬件接口吗?

错误,控制面板的作用是对系统进行有关的设置。控制面板是一个系统文件夹,用来提供各种对计算机系统进行设置和管理的工具;使用控制面板可以对系统进行设置与管理,例如设置系统环境参数的默认值和属性,添加新的应用程序…

不知道工作组名称怎样加入_剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了...

剩米饭不知道怎样做?试试泡菜炒饭,再也不用担心米饭做多了东北的朋友这几天连续经历了春天,初夏和冬天,甚至在一天中看到了雪、雨和冰雹。这变化莫测的天气让大家一时间慌了神,不知到底要穿些什么。由于楼上都已经停了…

php元素浮动会产生哪些影响,css浮动带来什么问题

css浮动带来的影响:1、由于浮动元素脱离了文档流,所以父元素的高度无法被撑开,影响了与父元素同级的元素;若没有给父元素设置高度,那么父元素就不会在显示屏上显示。2、浮动元素不再占用原文档流的位置,它会…

linux将字符串转小写_小猿圈总结Linux常见命令(一)

科技发展的今天,互联网不断的发达,很多人学习Linux云计算的时候回因为记不住一些命令从而去找度娘,有时候因为因为找不到linux的命令而烦恼,下面是小猿圈linux讲师给大家总结的linux常见命令,希望对你有所帮助。1、cd命…

cnpm安装webpack_Webpack(一)介绍

一、Webpack是什么、为什么要使用它简单来说,Webpack是一个打包工具。站在2018年的角度,成为一个优秀的前端工程师,除了要会写页面样式和动态效果之外,还需要会用主流的单页面框架、Node.js、简单的前端的性能优化等等。加上现在一…

bytes数组转string指定编码_一篇文章弄懂Python中所有数组数据类型

前言数组类型是各种编程语言中基本的数组结构了,本文来盘点下Python中各种“数组”类型的实现。listtuplearray.arraystrbytesbytearray其实把以上类型都说成是数组是不准确的。这里把数组当作一个广义的概念,即把列表、序列、数组都当作array-like数据类…

sklearn保存svm分类模型_【菜菜的sklearn】07 支持向量机(上)

小伙伴们大家好~o( ̄▽ ̄)ブ,我是菜菜,这里是我的sklearn课堂第7期,今天分享的内容是支持向量机(上),下周还有下篇哦~我的开发环境是Jupyter lab,所用的库和版本大家参考&a…

unity 敌人自动攻击和寻路_Unity暑期萌新入门:环境篇

大家好,新一期又跟大家见面了。上一节我们完成了角色的移动控制,然而John只能在空白的场景中移动。因此接下来这一节我们将添加关卡、调节光照,让John来到阴森的鬼屋。然后设置NavMesh(导航网格,现在先听个概念就好),为…

element 表格宽度自适应_Java 设置Word中的表格自适应的3种方式

概述在Word创建表格时,可设置表格“自动调整”,有3种情况,通过Java程序设置可调用相应的方法来实现,即:根据内容调整表格AutoFitBehaviorType.Auto_Fit_To_Contents根据窗口调整表格AutoFitBehaviorType.Auto_Fit_To_W…

源码里没有configure_深入源码理解.NET Core中Startup的注册及运行

开发.NET Core应用,直接映入眼帘的就是Startup类和Program类,它们是.NET Core应用程序的起点。通过使用Startup,可以配置化处理所有向应用程序所做的请求的管道,同时也可以减少.NET应用程序对单一服务器的依赖性,使我们…

oracle查询慢怎么优化,Oracle查询优化-怎样建立索引优化下面的查询语句啊

下面是转换出来的查询语句SELECT *FROM (SELECT "Project1"."C1" AS "C1","Project1"."ID" AS "ID","Project1"."NVC_ORDERBY" AS "NVC_ORDERBY","Project1"."I_ST…

复试情报准备

英语自我介绍,介绍完老师会根据你的回答用英语问你问题,比如介绍一下你的本科学校,或者家乡什么的。计网过一遍,会问两道题。接下来是重点,我当时是根据我成绩单,问了我本科学过的科目,比如pyth…