【移动应用开发技术】详解flutter engine 那些没被释放的东西_第1页
【移动应用开发技术】详解flutter engine 那些没被释放的东西_第2页
【移动应用开发技术】详解flutter engine 那些没被释放的东西_第3页
【移动应用开发技术】详解flutter engine 那些没被释放的东西_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】详解flutterengine那些没被释放的东西

由于flutter一直存在内存泄漏的问题,导致很多开发者不胜困扰,博主在0.9.4就开始对其代码内部内存问题在engine层面修改代码,得到解决,但是对于每个版本都需要跟随官方打包,对于开发者并不是很友好。然而喜出望外的是,在后来的几个版本中,官方内置开发了手动释放内存的方式:smile_cat:翻译如下:销毁引擎的运行上下文。此方法可用于强制FlutterEngine对象释放所有资源。发送此消息后,对象将处于不可用状态,直到解除分配为止。访问属性或向其发送消息将导致未定义的行为或运行时错误。但是,但是,但是,(重要的事说三遍)在Flutterengine开发群里面,有群友反馈还有很多问题偶现崩溃的是什么鬼,暂时没有遇到,不好说。之前博主遇到的崩溃是自己使用方式的问题,在fluttervc关闭之后还有任务在执行methodchannel,即还在调用plugin,这个可以在开发上避免。值得注意的是,flutter中使用c++实现,自己对于内存管理并不是很好内存问题自测如下确实存在问题,还有将近30M没有被释放,查看一下当前内存对象,如下图一个一个看还有那些没有被释放吧android:LruCacheLeastRecentlyUsed近期最少使用算法。内存管理的一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,flutterengine会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。dart::BackgroundComplier对isolate编译优化的类BackgroundCompiler在后台线程中运行优化编译的类。实现:每个隔离一个任务,它与拥有isolate一起消失,后台编译器中没有OSR编译。dart::bin::socketvm和开发平台通信的机制,比如jit即时编译的dill文件,通过socket传递给dartvm,vm通过rpc加载文件,重置线程,从而实现hotreload热重载dart::BoolPrameter定义在dartvm,service.cc中,都继承自MethodParameter,做对应参数校验,参数解析用。编译dart文件用的dart::OSThread在dart运行时负责操作系统线程,创建线程,移除线程,线程查找与管理。如下图FlutterEngineRegistrar注册使用key注册plugin的地方,所有plugin调用dart底层的方法都会通过handlemethodcall回调给使用者,其初始化的地方是引起内存泄漏的地方此处有一篇文章介绍,解决engine的循环引用文章FlutterStandardMethodCodec标准方法编解码FlutterStringCodecstring编解码FlutterJsonMessageCodecjson编解码不看不知道,一看吓一跳,也竟然是个单例,当然不会被释放了,也能理解,在flutter中用到jsonmssage的地方很多,用不着每次都初始化代码实现的地方std:share_ptrxxx共享指针指针获取flutterisolateservicedart

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论