安卓动态化实践概览---虚拟运行环境

一、React Native和flutter

安卓动态化实践概览---虚拟运行环境_第1张图片

flutter的效率比React的效率要高,Flutter 是一个性能和效率至上,但是动态化能力非常有限的框架

二、flutter热加载原理分析

  • 首先_updateDevFS()会将工程中文件逐一扫描,检查是否有删除、新增或者改动,扫描完成后,生成kernel files,命名为app.dill.incremental.dill文件,通过HTTP端口发送给DartVM;
  • 将扫描生成的.dill文件路径,通过RPC接口调用_reloadSources,进行资源加载;
  • 确认VM资源重载成功,将FlutterDevice UI线程重置,通过RPC接口,触发flutter widgets树重建、重绘

理解这个流程,前提需要明确Flutter的编译模式。

编译模式大体可以分为两种,AOT编译与JIT编译。JIT全称是Just In Time,代码可以在程序执行时期编译,因为要在程序执行前进行分析、编译,JIT编译可能会导致程序执行时间较慢;而AOT编译,全称Ahead Of Time,是在程序运行前就已经编译,从开发者修改代码、编译较慢,但运行时不需要进行分析、编译,因此执行速度更快。

Flutter使用了独特的编译模式,开发阶段下,使用Kernel Snapshot模式(对应JIT编译),将dart代码生成标记化的源代码,运行时编译,解释执行;release阶段,ios使用AOT编译,编译器将dart代码生成汇编代码,最终生成app.framwork,android使用了Core JIT编译,dart转化为二进制模式,在VM启动前载入。

因此,基于开发阶段的Kernel Snapshot编译模式下,我们可以得知Hot Reload扫描项目文件,将有改动的dart文件转化为标记化源代码kernel files,发送到正在运行的DartVM,DartVM替换资源,然后通知Flutter Framework重建、重新布局、重新绘制WidgetsTree,即可看到改动效果。

安卓动态化实践概览---虚拟运行环境_第2张图片

三、咸鱼flutter动态化实践

1、下载安卓编译的产物,在安卓端可行,加载咸鱼编译出来的so,插件化动态加载这个so文件

2、把flutter的页面节点转化为json,动态加载这个ASTNode,转化为widget node tree

来源:

flutter热重载原理:https://juejin.im/post/5bc80ef7f265da0a857aa924

咸鱼app:https://www.yuque.com/xytech/flutter/tc8lha

美团外卖:https://tech.meituan.com/2018/08/09/waimai-flutter-practice.html

头条app:https://mp.weixin.qq.com/s/-vyU1JQzdGLUmLGHRImIvg

爱奇艺:https://mp.weixin.qq.com/s/7GSPvP_hOWCv64esLLc0iw

网易新闻客户端:https://mp.weixin.qq.com/s/a0in4DqB8Bay046knkRr1g?

京东:https://mp.weixin.qq.com/s/UhfgfNEdogm7Busr0apAGQ

马蜂窝:https://mp.weixin.qq.com/s/WBnj_6sOonjR9XUnB-wZPA

 

 

 

 

你可能感兴趣的:(安卓动态化实践概览---虚拟运行环境)