Flutter 上的内存泄漏监控(1)

3、Dart vm_service

Dart VM Service (后面简称 vm_service)是 dart 虚拟机内部提供的一套 web 服务,数据传输协议是 JSON-RPC 2.0。不过我们并不需要要自己去实现数据请求解析,官方已经写好了一个可用的 dart sdk 给我们用 vm_service。

ObjRef, Obj 和 id 的作用

先介绍 vm_service 中的核心内容:ObjRef、Obj、id

vm_service 返回的数据主要分为两大类, ObjRef(引用类型) 和 Obj(对象实例类型)。其中 Obj 完整的包含了 ObjRef 的数据,并在其基础上增加了额外信息(ObjRef 只包含了一些基本信息,例如:id,name…)。

基本所有的 api 返回的数据都是 ObjRef,当 ObjRef 里面的信息满足不了你的时候,再调用 getObject(,,,)来获取 Obj。

关于 id: Obj 和 ObjRef 都含有 id,这个 id 是对象实例在 vm_service 里面的一个标识符,vm_service 几乎所有的 api 都需要通过 id 来操作,比如:getInstance(isolateId, classId, ...)getIsolate(isolateId)getObject(isolateId, objectId, ...)

如何使用 vm_service 服务

vm_service 在启动的时候会在本地开启一个 websocket 服务,服务 uri 可以在对应的平台中获得:

  • Android 在 FlutterJNI.getObservatoryUri()
  • iOS 在 FlutterEngine.observatoryUrl

有了 uri 之后我们就可以使用 vm_service 的服务了,官方有一个帮我们写好的 sdk vm_service ,直接使用内部的 vmServiceConnectUri 就可以获得一个可用的 VmService 对象。

vmServiceConnectUri 的参数需要是一个 ws 协议的 uri,默认获取的是 http 协议,需要借助 convertToWebSocketUrl方法转化下

4、泄漏检测实现

有了 vm_service 之后,我们就可以用它来弥补 Expando 的不足了。按照之前的分析,我们要获 Expando 的私有字段 _data, 这里可以使用 getObject(isolateId, objectId) api,它的返回值是 Instance,内部的 fields 字段保存了当前对象的所有属性。这样我们就可以遍历属性获取到 _data,来达到反射的效果。

现在的问题是 api 参数中的 isoateId 和 objectId 是啥,根据我前面介绍的 id 相关内容

你可能感兴趣的:(程序员,flutter)