效果展示

上面铁军中的这个关于我们页面以及转换为了动态化页面。

动态化标签

动态化路由

一个flutter页面转换为动态化页面,只需要添加动态化标签和动态化路由就行了,对业务页面的开发修改很少,相比其他动态化方案是巨大的优势。

方案对比方案名称美团满帮众能

三个方案都必须使用proxy方法,因为flutter中的dart阉割了反射,必须通过某种方式通过proxy方法来调用dart方法。 proxy方法如下图,这是扫描铁军App自动生成的:

众能的方案对比美团,优势在于使用了成熟的lua虚拟机的机制,在运行时执行的是指令,例如加法 会被编译两个loadConstant指令和一个binaryArith指令。而美团的方案核心是自定义的运行时,基本单位是语句和表达式,粒度粗了一个级别,直接的影响就是不支持async和await等异步语法。

众能的方案对比满帮,优势在于自动支持所有的flutter组件、第三方和自定义组件,同时开发调试时是使用flutter自带的编译器和调试器。而满帮方案开发时只能使用js语言,同时只能使用有限的flutter组件,有限的业务组件。

核心原理比喻

众能的方案核心其实和乐高积木一样:

普通flutter页面就像上面这个塑料恐龙,要改动一点必须在工厂重新生产。

使用众能动态化的页面,相当于使用很多个小块的乐高积木模仿出了原始的页面,小块的乐高积木就是proxy方法。 所以动态化页面其实是高仿的页面,和原始的页面有些细微的不一致。 但是优势就是动态化的页面可以在自己在运行时修改。

动态化流程1-jenkins打包

jenkins流水线在xcode编译前加入了动态化工具下载,以及动态化编译就是流程图中黄色的部分。

动态化流程2-启动注册路由

每一个动态化dart文件都会编译出.out字节码文件,但只有带routerModel的页面.out文件都才要在启动时执行生成routerModel

.out字节码文件就是上图这样,在启动时执行这个字节码就会生成routerModel,然后动态化虚拟机就休眠了,直到进入动态化页面才会启动。

这个字节码的内容是和lua字节码完全一致的,甚至在项目初期真正的lua字节码可以在mars_vm中运行并输出一样的结果,python、java等虚拟机中字节码也是类似结构,都有指令集,本地变量集合等信息。 虚拟机是另外一种语言来执行目标语言的,例如lua官方虚拟机是使用c语言来执行lua,也有go语言版本的。python虚拟机有java、c、go等多个版本。 众能的这个虚拟机是dart实现的,可以执行lua和dart。

动态化流程3-进入页面

进入页面后就会执行路由routerModel的block,完成页面初始化为为statefullWidget,并按照StatefullWidget本身的生命周期调用对应方法。

最简单的虚拟机指令展示

动态化运行hello_world代码,完成hello world字符串打印,这个在虚拟机里面是比较复杂的,因为要用到包加载等功能。 最简单的指令是算数运算指令,例如下面这个加法。

a = b + 100

会被编译为三条指令,load指令从寄存器中加载b到栈顶,load指令从常量表中加载c到栈顶, 执行算数指令把栈顶的两个数弹出进行算数运算,结果放入a寄存器的位置。

待完善的功能点

1、目前虚拟机调试时不能和原始的dart代码对应上,还好预留了行号信息等字段,一个月内应该可以加上。

2、目前的命名空间实现不够完善,同一个库内类名不能重复。 3、调用proxy方法的指令过多,通过修改命名空间的机制,应该可以把指令数减半。 4、没有实现方法缓存,反复调用同一个方法的话,会重复使用指令加载这个方法。

文章到这里就结束了,你也可以私信我及时获取最新资料。如果你有什么意见和建议欢迎给我留言。

flutter不支持热更新_真当Flutter不能热更新?众能动态化Flutter相关推荐

  1. 博图os更新_西门子PLC固件如何操作更新?

    随着西门子PLC中的TIA 软件V14 版本以及S7-1200 CPU V4.2 固件版本的发布,S7-1200 CPU的固件已经可以通过以下几种方式进行升级: 1.使用存储卡更新CPU固件. 2.使 ...

  2. 苹果屏蔽更新_如何屏蔽苹果系统自动更新

    以前都是安装tv描述文件即可屏蔽,但最近该文件提示过期失效了,所以目前需要采取其他方法来屏蔽ios13系统的自动升级啦 未越狱用户 原理:通过关闭手机(设置)的联网状态从而实现不自动下载更新文件(修改 ...

  3. 如何关闭win10自动更新_如何关闭win10系统自动更新

    现在win10系统市场占有率已经非常高了,而且很多新的电脑不在支持以前版本的系统,但是用过win10系统的朋友们会发现win10系统经常会在后台进行自动更新,不仅占用系统资源,使电脑变卡,而且还找不到 ...

  4. 系统要不要更新_手机经常弹出“系统更新”,到底要不要更新?用户:后悔已来不及...

    阅读本文前,请您先点击上面的蓝色字体"生活妙招噻",再点击"关注",这样您就可以继续免费收到内容了.每天都有分享.完全是免费订阅,请放心关注. 手机已经成为人们 ...

  5. oracle 子表数据变化时主表也会更新_亿信ABI版本重大更新,新增60余个实用新功能,还有一项黑科技...

    今年,亿信ABI横空出世,产品一经推出,前来体验.咨询.购买的客户络绎不绝.老板点赞,客户开心,年终奖感觉又要翻几番. 但是紧接而来的是,广大用户对于产品优化的需求就如同潮水一般涌来-- 为此,我们的 ...

  6. ogg 查看某条更新_明道云Web 6.1更新:日历视图上线

    更新时间:2020年12月22日(周二)19点 预计时长:2小时 是否停服:否 版本代号:Web 6.1(移动端需同步强制更新) 主要更新功能 日历视图 日历视图让用户能从时间维度排列并管理业务数据, ...

  7. pve 不订阅更新_??“吃鸡”体验服已无更新,暗夜危机2.0或将被1款新游代替

    大家好,欢迎来到由小鱼干开讲的<吃鸡新鲜事速报>,最近大家应该也看了不少体验服的更新吧,本次体验服更新的内容还是挺多的,包括有1张新地图.2个新玩法.2个新模式. 同时,端游的近战武器投掷 ...

  8. iphone屏蔽系统更新_手机资讯:iOS12 屏蔽系统更新的描述文件已失效怎么办

    如今使用IT数码设备的小伙伴们是越来越多了,那么IT数码设备当中是有很多知识的,这些知识很多小伙伴一般都是不知道的,就好比最近就有很多小伙伴们想要知道iOS12 屏蔽系统更新的描述文件已失效怎么办,那 ...

  9. win101909要不要更新_近年最稳的Win10更新?Win10 1909值得升级吗

    代号19H2的Win10 v1909预计将于11月13日发布.对于这个版本,外界一直有很多猜测.由于它的命名规则和之前的19H1很像,好多网友认为这一版中可能会增加很多新功能. 但实际情况并非如此,1 ...

最新文章

  1. playbook核心元素之 模板template 介绍(7)
  2. python爬虫赚钱途径-终于领会python爬虫赚钱的途径
  3. List, Set, Map是否继承自Collection接口?
  4. Spring--Context
  5. hdfs 多个文件合并_hadoop学习笔记3 hadoop程序将本地文件夹中多个文件,合并为一个文件并上传到hdfs中--梦飞翔的地方(梦翔天空)...
  6. 音视频开发(32)---H.264/AVC 主流视频编码标准的发展
  7. MATLAB中的光照处理
  8. php中的正则表达式相关例题,实例学习PHP中的正则表达式
  9. 08_实现用户邮箱激活
  10. 优化算法(1):最速下降法、牛顿法
  11. html 时间控件滚动选择器,TimePicker
  12. 新视野大学英语(第三版) 读写教程4 课后答案
  13. ppt模板网站哪个好
  14. 解决 EIGEN_STACK_ALLOCATION_LIMIT, OBJECT_ALLOCATED_ON_STACK_IS_TOO_BIG 报错
  15. August Rush
  16. 1987年,国际C语言混乱代码大赛
  17. 微信开发者工具测试小程序
  18. vue3以及vue2自定义封装v-model
  19. fiddler mac
  20. 【学习率】梯度下降学习率的设定策略

热门文章

  1. PHP:Iterator(迭代器)接口和生成器
  2. python trie
  3. 回望之六:太阳山与红寺堡
  4. 解决openresty http客户端不支持https的问题
  5. java中线程池的使用方法
  6. 通示jQuery实例方法,未DOM对象添加多个方法
  7. windows添加删除程序打不开解决方案
  8. Android获取所有Activity
  9. JavaScript 变量提升
  10. vue项目中iview表单验证 this.$refs[name].validate(valid = { }无效