产生埋点
埋点对象的参数
- 参数是信息承载: 埋点的业务意义,是需要很多业务参数的
- 对象上的参数: 大部分参数,都是绑定或者说声明到对象上的
- 再来回顾下前面这个图
一切基于 VTree
- 基石VTree: 所有的埋点,都基于虚拟树,虚拟树是基石
- 曝光埋点: 资源/元素的曝光,是我们做数据分析很重要的埋点
- 事件埋点: 比如用户的点击事件、页面的下拉刷新事件、歌曲的播放事件,等等,都是事件埋点
- 埋点结构化: 有了虚拟树VTree,所有埋点都可以做到结构化,具备上下层级关系
VTree的产生
- AOP: SDK内部做了很多AOP,监控UI的变化
- 源源不断的构建VTree: 当UI变动的时候,构建出一颗虚拟树VTree
随着时间,会源源不断的生成新的VTree:
曝光埋点
- 之前曝光分为三类:
- 页面的曝光: 云音乐底层hock方式, viewstart/viewend
- 列表元素曝光: 列表曝光组件来做, impress/impressend
- 其他UI元素的曝光: 业务方来自定义控制, impress/impressend
- 统一:
- 特征: 所见即曝光,不可见即曝光结束
- SDK内基于先后两个VTree来做节点的曝光(包含 page element 的曝光开始和曝光结束)
- 概要机制:
- 先后生成 VTree1, VTree2 两棵虚拟树
- 仅仅在 VTree1 中出现的节点,需要曝光结束
- 仅仅在 VTree2 中出现的节点,需要曝光开始
- 所见即曝光: 跟随UI元素的显示一样,被看见了,就曝光;消失了,就曝光结束
比如T1时刻生成的VTree:
T2时刻生成的VTree:
前后两棵树diff,生成曝光数据
上述两颗VTree的diff结果:
- T1存在T2不存在的节点: 3, 4, 6, 7, 8, 11
- T1不存在T2存在的节点: 20, 21, 22, 23
上面的diff结果,就是曝光埋点的结论
- 曝光结束: 3, 4, 6, 7, 8, 11
- 曝光开始: 20, 21, 22, 23
事件埋点
- 发生在节点上: 事件埋点如果发生在对象上,则是该对象的事件埋点
- 举例:
- 歌曲收藏: 发生在收藏按钮上,那么收藏按钮锁关联的歌曲信息,以及该收藏按钮所在的页面 header 模块信息,以及当前页面的信息,均被记录在埋点日志中
- 页面下拉刷新: 发生在页面上,那么就会有该页面的信息在埋点日志中
埋点格式预览(示例)
{
"_elist": [
{
"_oid": "【必选】元素的oid",
"_pos": "【可选】,业务方配置的位置信息",
"biz_param": "【按需】业务参数"
}
],
"_plist": [
{
"_oid": "【必选】page的oid",
"_pos": "【可选】,业务方配置的位置信息",
"_pgstep": "【必选】, 该page/子page曝光时的页面深度"
}
],
"_spm": "【必选】这里描述的是节点的“位置”信息,用来定位节点",
"_scm": "【必选】这里描述的是节点的“内容”信息,用来描述节点的内容",
"_sessid": "【必选】冷启动生成,会话id",
"_eventcode": "【必选】事件: _ec/_ev/_ed/_pv/_pd",
"_duration": "数字,毫秒单位"
}