Flutter 混编:轻量级的Engine管理方式

Flutter混编上最大的一个问题,就是Engine的使用,从内存和性能,以及混合栈等多个层面上的综合考虑,业界给出了很多不同的Engine管理方案,就官方而言,在add2app文档中,就列出了几种不同的Engine管理方式,例如直接创建Engine、使用FlutterEngineCache等方式,官方文档如下所示。

https://docs.flutter.dev/development/add-to-app/android/add-flutter-screen#step-3-optional-use-a-cached-flutterengine

这些方案在文档上比较详细了,就不赘述了,这里重点讲解一种轻量级的Engine管理方式——Multiple Flutter Instance。

这是官方的一个比较新的Engine管理方案,它会创建多个彼此隔离的Flutter Engine,数据之间互不相通,以此缺陷来换取每个Engine的内存性能提升。

它有点像IT中的Thin Client的概念,每个Thin Client本身与其它多个Thin Client彼此隔离,但是却可以获取中央主机中的信息和数据,可以说,Multiple Flutter的方案,应该是Flutter团队在Add2App众多方案中的一个折中方案。在某些场景下来说,可行性比其它方案更好。

下面来看下Multiple Flutter的接入流程,首先,在Application中,创建FlutterEngineGroup并初始化。

class App : Application() {
    lateinit var engines: FlutterEngineGroup

    override fun onCreate() {
        super.onCreate()
        engines = FlutterEngineGroup(this)
    }
}

接下来,新建一个Activity,继承自FlutterActivity,并在Manifest文件中申明,这些都是常规操作了。

<activity
    android:name=".flutter.SingleFlutterActivity"
    android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
    android:hardwareAccelerated="true"
    android:theme="@style/Theme.MultipleFlutters"
    android:windowSoftInputMode="adjustResize"
    />

最后,在FlutterActivity中,引用Engine。

class SingleFlutterActivity : FlutterActivity() {

    val engine: FlutterEngine by lazy {
        val app = activity.applicationContext as XXApplication
        val dartEntrypoint =
            DartExecutor.DartEntrypoint(
                FlutterInjector.instance().flutterLoader().findAppBundlePath(), "main"
            )
        app.engines.createAndRunEngine(activity, dartEntrypoint)
    }

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        SchemaBookApi.NativeBookApi.setup(flutterEngine.dartExecutor, NativeBookApiImp(this, lifecycleScope))
    }

    override fun provideFlutterEngine(context: Context): FlutterEngine? {
        return engine
    }

    override fun onDestroy() {
        super.onDestroy()
        engine.destroy()
    }
}

代码还是比较简单的,核心就是Engine的获取,通过FlutterEngineGroup提供的createAndRunEngine方法,就可以从FlutterEngineGroup中获取到一个「Thin Client」了。

这里还解决了使用Multiple Flutter的一个比较重要的问题,那就是初始路由的问题,通过dartEntrypoint,我们可以自定义初始路由的跳转,从而在多个不同的逻辑上,选择实际的跳转逻辑。

在Flutter中,我们需要给不同的dartEntrypoint增加入口函数。

void main() => runApp(const MyApp(color: Colors.blue));

@pragma('vm:entry-point')
void topMain() => runApp(const MyApp(color: Colors.green));

@pragma('vm:entry-point')
void bottomMain() => runApp(const MyApp(color: Colors.purple));

这样就实现了多路由逻辑的跳转,对应的函数名,就是dartEntrypoint的name。

再配合上一期的「Pigeon高速路」,混编中对Engine的管理和数据通信的基本架构就建立好了。

作者:徐宜生
原文链接:https://mp.weixin.qq.com/s/9Ffc9rTBrlCsqD_y5OtslA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值