本文主要是介绍前车之鉴:聊聊钉钉 Flutter 落地桌面端踩过的“坑” | Dutter,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
作者:刘太举(驽良)
《Dutter 系列文章》将阐述钉钉基于 Flutter 构建的跨四端应用框架(代号 Dutter)的技术实践与踩坑经验,共分为上、下两篇,上篇内容可点击 Dutter | 钉钉 Flutter 跨四端方案设计与技术实践,本文为下篇,感谢阅读。
本文主要介绍一下钉钉 Flutter 业务灰度过程中,在桌面端遇到并处理过的几个 FlutterEngine 层面的 Bug。具体包含:
- Mac 端:
- FlutterEngine 退出之后内存泄漏问题;
- FlutterEngine shutdown 阶段死锁问题;
- 低版本 macOS OpenGL 析构阶段 Crash 问题;
- Windows 端:
- Win7 设备渲染模块「Crash + 残影」问题;
- FlutterPlugin 注册阶段野指针 Crash;
- Flutter Window 可见性变化之后页面白屏。
下面来为大家分别介绍一下。
FlutterEngine Mac 端问题
1.1 FlutterEngine 退出之后内存泄漏问题
问题背景
Mac 端 FlutterViewController 在销毁之后,其开辟的内存并未并实际释放,会出现内存泄漏问题。此问题在 Flutter issue 中有一些讨论,但一直未有明确定位。在钉钉 Mac 端 Flutter 业务灰度过程中也遇到此问题,如无法处理将直接影响 Dutter 在 Mac 端落地的可行性:
定位分析
一句话原因:
Mac 端 FlutterEngine 实现中对 weak property 使用不合理导致。FlutterViewController 强持有 FlutterEngine,后者持有一个指向 FlutterViewController 的 weak property。FlutterViewController 在 dealloc 流程中尝试释放 FlutterEngine,但是此时 FlutterEngine 中持有的 weak property 已经无法正确访问(nil),导致释放流程未能正常执行,出现泄漏。
下面结合具体实现来为大家做一个简单说明。
由于设计到 OC 和 C++ 对象生命周期管理问题, FlutterEngine 内部对象持有关系略微特殊一些,大致如下图所示:
- FlutterViewController 作为对外暴露的主要 Class,负责创建并持有 FlutterEngine 以及 FlutterView;
- FluterEngine 在初始化阶段会自己强持有自己,并在 shutdown 时自我 Release;
- FlutterEngine 会创建并持有 FlutterRenderer,FlutterRenderer 会强持有 FlutterView;
- FlutterEngine 间接强持有 FlutterView;
- FlutterEngine 有一个指向 FlutterViewController 的弱引用指针。</
这篇关于前车之鉴:聊聊钉钉 Flutter 落地桌面端踩过的“坑” | Dutter的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!