美文网首页
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