美文网首页
Flutter FlutterEngine在Android端的

Flutter FlutterEngine在Android端的

作者: mtko | 来源:发表于2020-06-06 14:45 被阅读0次

先抛出一个问题和结论

创建多个引擎会对内存造成压力吗?
给出结论:不会

物料

Flutter:1.17.2
JDK:1.8.0_251

对这三个case进行测试

  • 单个引擎对内存的影响
  • 多个引擎对内存的影响
  • 后启动引擎是否会使用先启动引擎开辟的部分内存?

单个引擎对内存的影响

不启动引擎

  1. app内存占用109.9M
    image.png

启动引擎

  1. 启动app,启动引擎,此时app内存占用110.3M

    image.png
  2. 进入一个几乎没有视图元素的Activity,然后退出; 此时app内存占用117.5MB

    image.png
  3. 重复2步骤;此时app内存占用113.8MB

    image.png
  1. 重复2步骤;此时app内存占用114.6MB
    image.png
  • 结论1:启动一个引擎对内存影响不大
  • 结论2:启用引擎 + 进入过Activity对内存的影响是114.6 - 107.6 = 7MB

多个引擎对内存的影响

  1. 两个cache引擎
    调用
FlutterActivity.withCachedEngine(engineId).build(context)

启动两个cache引擎,分别进入一个无大量数据的Activity,然后退出,此时app内存占用131.9M

img1.png
  1. 一个cache引擎,一个new引擎
    调用
FlutterActivity.withNewEngine(engineId).initialRoute(route).build(context)

启动一个cache引擎,一个new引擎(引擎生命周期跟随FlutterActivity),分别进入一个无大量数据的Activity,然后退出,此时app内存占用126.4MB

img2.png

结论:创建一个cache引擎要比创建一个new引擎并稍后销毁一个new引擎多占用起码5.5M内存

后启动引擎是否会使用先启动引擎开辟的部分内存?

测试1:
阶段1:启动一个new引擎 + 进入activity,并销毁引擎 + 退出Activity,内存122(启动前) -> 130(销毁后)
阶段2:启动一个new引擎 + 进入activity,并销毁引擎 + 退出Activity,内存130 (启动前) -> 132(销毁后)

测试2:
阶段1:启动一个cache引擎,进入activity,并销毁引擎 + 退出Activity,内存109(启动前) -> 120(销毁后)
阶段2:启动一个new引擎,进入activity,并销毁引擎 + 退出Activity,内存120(启动前) -> 123(销毁后)

结论:
1.会使用。从测试1和2可以看出,在阶段1经历一次创建、销毁引擎后,会开辟一块高于单个engineVM的顶级运行时常驻内存,下次创建引擎只会增量开辟2~3MB内存
2.单个engine销毁只会销毁和本引擎相关的插件内存、JNI环境、资源;顶层内存并不会释放,而是用于下一次引擎创建
3.所以,在业务中创建多个engine并不会造成内存压力

相关文章

网友评论

      本文标题:Flutter FlutterEngine在Android端的

      本文链接:https://www.haomeiwen.com/subject/mjcvahtx.html