如何在原生Android应用中将Flutter模块作为按需模块添加
Flutter 模块接入原生 Android 实现按需加载的实现方案
Flutter 模块完全可以配合 Android 的 Dynamic Feature 特性实现按需加载,这是目前成本最低、稳定性最好的实现方案,除此之外也有自研动态加载的可选方案,具体说明如下:
方案1:基于 Android Dynamic Feature (DFM) 实现
这是官方推荐的主流方案,实现步骤如下:
- 先将现有 Flutter 模块编译为 release 版本的 AAR 产物,编译时添加
--no-debug--no-profile参数,产出的 AAR 已包含 Flutter 运行时、业务代码、资源文件等全量依赖 - 在原生 Android 项目中新建 Dynamic Feature 模块,将上一步得到的 Flutter AAR 作为依赖仅引入该 DFM 模块,不要在主 app 模块中添加任何 Flutter 相关依赖
- 在 DFM 模块中封装 Flutter 引擎初始化、Flutter 页面跳转的桥接逻辑,主 app 模块仅保留触发 DFM 下载的入口,不感知 Flutter 相关实现
- 接入 Play Core SDK 实现 DFM 的按需下载、安装逻辑,待 DFM 安装完成后再调用其内部封装的桥接逻辑即可打开 Flutter 页面
若为国内分发场景无法使用 Google Play 分发能力,可自行实现 DFM 安装包的下载、签名校验、动态加载逻辑,系统层面的 DFM 动态加载能力本身不受应用商店限制
该方案优势:
- 完全符合 Android 官方开发规范,适配成本极低,无需修改 Flutter 引擎源码
- 系统原生支持类加载、资源加载的隔离,稳定性有保障
- 后续 Flutter 模块迭代仅需更新 DFM 包即可,无需修改主 app 逻辑
方案2:自研 Flutter 产物动态加载方案
如果有特殊定制需求不想使用 DFM,可自行实现全流程的动态加载:
- 将 Flutter 编译产物(Flutter 引擎 so、业务代码 so、资源包)拆分打包为独立的压缩包,自行搭建分发服务
- 原生端在需要使用 Flutter 模块时,下载对应压缩包,签名校验后存储到应用私有目录
- 自定义 Flutter 引擎初始化逻辑,指定加载私有目录下的引擎 so、业务 so 以及资源路径,初始化完成后即可跳转 Flutter 页面
该方案适配成本较高,需要处理不同 CPU 架构的 so 适配、资源路径匹配、引擎版本兼容等问题,仅推荐有深度定制需求的场景使用
注意事项
- 无论使用哪种方案,都需要保证动态加载的 Flutter 产物的引擎版本,和原生端依赖的 Flutter 引擎版本完全一致,否则会出现加载失败、崩溃等问题
- 不同应用商店对动态下发代码的监管要求不同,上线前需要确认对应渠道的规则要求
内容的提问来源于stack exchange,提问作者Nandhakumar
相关产品推荐
相关产品推荐

