MTFlexbox自动化埋点探索
总第350篇
2019年 第28篇
MTFlexbox架构图
MTFlexbox基本上支持Native上常用的基础控件的展示,对有UI定制化的需求支持度很高。但MTFlexbox的XML布局需要在运行前编写完成,只支持简单的三元表达式,逻辑能力有限。因此,MTFlexbox特别适合布局样式复杂、变动频繁但交互简单的业务场景。例如美团App首页、搜索结果页等。这些业务场景都具备以下两个特点:
面向多业务方:各业务方有自己的个性化丰富样式,且不同时期可能需要不同的样式。
交互简单:点击跳转完成流量输送的简单交互。
下面是MTFlexbox使用场景的一些截图:
2.3 MTFlexbox自动化埋点前期工作
在美团实际的业务场景中,卡片的点击、曝光和加载数据是分析一个新产品形态上线效果好坏的最基本方式之一。相对应的,客户端的数据采集方式是洞察对于模块的点击、曝光和加载事件,然后结合上下文环境,比如页面标识、模块标识等,最后使用埋点上报工具和业务字段一起进行上报。MTFlexbox作为模块级别的动态布局UI展示框架,对于数据采集方式的支持也是必不可少的。MTFlexbox针对数据采集的方式,做了以下两件事:
制定了一套双端统一的埋点标准化规范。
埋点类型定义成Tag标签属性,写入布局文件中。
MTFlexbox结合美团自研的客户端数据上报工具,定义了多个专门针对埋点的特有属性字段,主要类型如下:
<Container style="width:360pt;justify-content:center;" >
<Var name="see_MGE4" type="json">
{
"bid":"xxxxx",
"cid":"yyyyy",
"lab":{
"isDynamic":true,
"gather_index":"{extra.gather_index}",
"index":"{extra.index}"
}
}
</Var>
<Container
see-mge4-report="{see_MGE4}"
click-url="{business.iUrl}"
visibility="{{display.itemDynamic.imageUrl}?visible:displaynone}" >
<Img style="width:331pt;height:106pt;justify-content:center;"
border-radius="5pt"
scale-type="center-crop"
src="{display.itemDynamic.imageUrl}"
background="#FFF8F8F8" />
</Container>
</Container>
2.4 MTFlexbox动态化研发流程
MTFlexbox动态化研发流程
从上述MTFlexbox动态化研发流程图中可以看出,数据需求和产品需求需要客户端开发人员在同一份布局文件中耦合在一起去实现,而且埋点属性和布局控件相绑定。这就导致在埋点过程中会出现很多问题,总结如下:
埋点成本过高
沟通成本较高:对于一个新的产品需求,首先产品需要将埋点需求提给数据组,数据同学理解了产品需求后产出埋点文档;然后产品、数据同学、客户端开发同学三方进行需求评审和埋点评审,沟通埋点需要上报的字段和时机等细节。很多时候,一次沟通不到位,还需要反复沟通或者重新沟通,直到产品、数据同学和客户端开发人员三方对需求和埋点的理解一致为止。平均一个5PD(5PD指5个工作日)的需求需要消耗数据同学和客户端开发人员各1PD的时间来进行理解和沟通。
开发成本过高:客户端开发人员在编写XML布局文件时,往往要花30%左右的时间进行手动埋点和自测校验。
埋点线上事故多
因整个埋点缺乏自动化的埋点校验和预警机制,一旦开发人员出现人为的失误,导致错埋、漏埋现象,都有可能引发严重的线上故障。例如,客户端开发人员手动埋点时,出现人为失误引入了错误数据;产品验收阶段需要修改布局样式,客户端开发人员会出现”仅修改布局而遗漏埋点“的问题。
鉴于MTFlexbox存在埋点成本过高和线上问题较多的突出问题,我们迫切的希望通过一些手段来最大程度的规避和解决这类问题。埋点成本过高的原因在于MTFlexbox将布局和埋点耦合在一起编写,客户端开发人员需要做的事情过于”杂“和”多“。找到了这个痛点,很容易想到将埋点上报和布局编写解耦,让客户端开发人员只负责编写布局,数据同学只负责埋点配置,以此降低开发和沟通成本;同时通过自动化埋点校验手段提升埋点准确率,优化流程,减少线上事故的产生。基于此,产出我们理想的布局和埋点解耦之后的动态化研发流程,如下图所示:
新的动态化流程
3. 业内自动化埋点方案调研与参考
3.1 美团外卖前端无痕埋点实践
外卖团队在他们原有代码埋点方案的基础上,演化出了一套轻量的、声明式的前端埋点方案。详细内容可以参考博客:《美团点评前端无痕埋点实践》。此方案通过声明式埋点的方式实现了埋点代码与业务逻辑的解耦,并且支持对通用的业务数据的自动化上报。但此方案不能完全实现自动化埋点,并且实现成本较高。
3.2 Mixpanel
HubbleData是网易开发的一个洞察用户行为的数据分析系统,提供一套完整的数据解决方案。
网易对XPath做了优化,主要体现在View索引的计算上:
原始XPath计算方式:每个ViewGroup下的所有View作为一个数组,索引从0开始。例如上图Button控件的XPath标识为:LinearLayout[0]/FrameLayout[0]/RelativeLayout[1]/Button[1]
网易XPath计算方式:每个ViewGroup下的所有View先按控件类型分类,然后再把每个类型中的控件按照数组的方式,从0开始。例如上图Button控件的XPath标识为:LinearLayout[0]#rootView/FrameLayout[0]/RelativeLayout[0]#container/Button[0]#btn
但是网易的这次优化,并没有解决由于同类型控件位置变更而引发的埋点错误问题,根源在于控件唯一标识不够准确。同时网易的修改仅限控件的一些固有属性,并没有搜集到更有价值的业务数据。
结合上述四种方案的优缺点,自动化埋点需要具备的几个条件,即:简洁直接的流程、友好可视化的前端配置界面、业务字段的可配置化、埋点有效性的检测。我们的方案就是基于这几个目标而诞生的。
整体流程
MTFlexbox自动化埋点的核心流程,分为以下五步:
(1)客户端开发人员根据设计稿开发XML样式文件,自测通过后将XML样式文件与接口数据上传至MTFlexbox管理后台。
(2)MTFlexbox管理后台自动连接远程移动设备,并发送布局处理命令。远程移动设备将布局渲染结束后,抓取截图和布局层级信息(包括控件父子关系、控件位置、大小等信息)并上传至管理后台。
(3)前端页面从后台拿到DPath路径信息、坐标信息和截图信息,提供一套可视化的界面供数据同学进行模块内任一控件的埋点圈选配置。数据同学根据自身的需求,从目录树中圈选出自己希望配置埋点的控件。如下图所示,右侧模块中会出现红圈将选中的控件标出。
目录树圈选控件
(4)选中某个控件之后,数据同学对该控件进行埋点配置,元素类型支持当前元素和同类元素。其中同类元素可以节省数据同学对于同一种类型的控件的多次配置。对于已经圈选出的控件,列表中会详细展示出相关的信息,并附上控件对于的位置截图,能够方便数据RD定位埋点的控件具体位置。
埋点配置
<Container>
<Var auto-mge="true" name="ff510aa110844bb78c0b86fb04b26460" type="json">
{
"bid" : "xxxxx",
"cid" : "sssss",
"lab" : {
"index" : "{_index}",
}
}
</Var>
<!-- 整个容器 -->
<Container background="#FFFFFF" border-radius="10pt"
click-mge4-report="{ff510aa110844bb78c0b86fb04b26460}"
click-url="{_iUrl}" padding-left="10pt" padding-right="10pt">
<!-- 左半部分 -->
<Container style="flex-direction:column;justify-content:flex-start;margin-top:15pt;">
目前MTFlexbox自动化埋点方案已经使用在美团首页、大搜等业务中,整体埋点成本降低了80%,上线后且无埋点故障。在此埋点方案的实现过程中,我们也踩了很多在设计之初没有预想到的坑,遇到了一些难点,详细设计问题和解决方案稍后的博客中的详细介绍,敬请关注美团技术团队公众号。
目前,我们基于MTFlexbox实现了View与埋点的自动化绑定,后期我们规划通过规范标准化后台下发的数据,包括业务数据和埋点数据,进而实现埋点数据的动态化下发和自动化绑定,进一步节省在埋点配置阶段和测试阶段的人力投入。
参考资料
作者简介
叶梓、腾飞、田贝、张颖,美团终端业务研发团队研发工程师。
---------- END ----------
美团终端业务研发团队现诚聘Android、iOS工程师,欢迎有兴趣的同学投简历至:tech@meituan.com(注明:美团终端业务研发团队)。