移动端埋点分析

本篇文章主要介绍Android移动端埋点的作用以及埋点发展,顺带加一点埋点技术分析。

埋点是什么

在应用中通过特定的流程收集一些信息,用来跟踪应用使用的状况,并作为优化产品或者提供运营的数据支撑。

移动端埋点可以收集到的数据

  • 手机基础数据(手机型号、版本、网络、浏览器版本等)
  • 用户相关数据(年龄、性别、职业、行业、喜好等)
  • 渠道相关数据
  • App质量和性能相关数据

埋点是用来做什么的

  • 检测运营状况
  • 市场趋势反映
  • App错误和缺陷的及时发现
  • 交互视觉效果分析

上面弄清楚了移动端埋点的作用和数据统计的维度,下面说说如何在代码中加入这些统计

代码埋点

最原始最简单的方法是,我们写一堆统计App数据的接口,然后封装成sdk,集成进App中,App任何地方需要统计任何数据,则在代码的任何地方埋入接口,并传入相应的数据,一般大家叫这种埋点为代码埋点。

这种埋点的优点很明显:可以统计任何维度的数据,而且统计很精准;但缺点也很明显:具有版本兼容问题(新统计的数据只能在新版本加入接口统计,旧版本没有数据),破坏代码结构(很多设计好的模块为了传入一些埋点数据需要修改代码),工作量太大(每个版本都要为埋点付出大量人力)。

为了克服代码埋点的缺点,勤(懒)劳(惰)的程序员们发挥自己的想象力,so,埋点又进化了。

无痕埋点(全埋点)

代码埋点不是工作量大?不是每个版本都要埋入代码么?不是破坏代码结构么?在无痕埋点这些问题通通不叫事,一行代码都不需要写(当然是在吹牛),数据就统计上去了。
究竟什么叫无痕埋点呢?通俗点说就是加入一些配置,然后某些控件做一些改动,就可以自动统计上报数据了(实现技术后面谈)。

无痕埋点的优点是:无版本兼容问题(应该每个版本统计的数据都是一样的,不存在兼容问题),不会破坏代码架构(不像代码埋点那样到处插入统计代码了);当然也有缺点:可记录的数据维度有限(基本只能记录一些用户交互数据,业务相关数据无法记录),统计的数据量过大(无差别统计每个控件的相关交互操作事件,统计量过多)。

以上关于无痕埋点的分析都基于开发层面,还有些基于运营层面的问题,例如:上报的控件事件如何区分是哪个页面的?后台人员是否可以配置?控件区分问题由开发和运营人员讨论确定就行,配置问题就涉及到无痕埋点的升级了。

可视化埋点

可视化埋点可以理解为无痕埋点的升级版,即可配置的无痕埋点=可视化埋点;此实现策略主要通过调用服务器接口埋点配置数据,根据这份配置,确认需要上报的埋点数据,规避了无痕埋点中上报很多垃圾数据问题。

作为无痕埋点的升级版,亦不能完全规避无痕埋点的缺点(譬如数据统计维度问题),so,代码埋点并没有过时,可视化埋点仅是埋点开发过程中为了提升效率产生的一种方案。
下面简单谈谈无痕埋点的实现原理。

无痕埋点实现

现在市面上的无痕埋点方案基本都是统计控件的点击、长按之类的事件,统计方式基本分为动态hook,静态hook;

  • 动态hook

在代码中某个位置监听所有控件的点击、长按相关事件,在事件里插入统计相关代码;Android中会在Application中添加Activity的生命周期监听,即ActivityLifecycleCallbacks,在里面获取相关Activity的RootView,从RootView出发深度优先遍历控件树,为满足特定条件的View设置代理监听,这里面主要涉及到几个技术点:View的唯一ID确定,Fragment生命周期问题

1)ViewID

每个需要统计的View要确保ID是唯一的,不可变的,这样才能让后台统计到的数据准确,为了做到这点,聪明的程序员们也是用尽手段:一种确定唯一ID方式为通过RootView路径和View的Index来标记ViewID(LinearLayout[0]#rootView/FrameLayout[0]/RelativeLayout[0]),一种是在代码中给每个View确定一个唯一ID。两种方案都可以解决问题,好坏不表,但这种设计方式碰到RecyclerView、ListView之类的列表View就可能会出现错误了,因为它的很多子View都是复用,常规的唯一ID统计方案在这里不起作用,这时就要加入一些特殊标记了,比如在列表的每个子View的唯一ID加入在列表中的位置

2)Fragment生命周期

上面介绍到我们统计Activity中的控件是在Application中做的,但是Fragment的相关Application却无法统计,这时候改如何办呢?首先确定Fragment的生命周期,它的生命周期并不能简单的按照onCreate、onResume、onDetory来决定,需要根据setUserVisibleHint、onHiddenChanged来共同确定,确定生命周期后,再把Fragment关联到相关的Activity,通过Activity就能调用到Fragment中的View了

  • 静态Hook

静态hook则是在代码编译期在需要统计的地方插入相应的统计代码,主要了解AbstractProcessor类就好

以上仅介绍无痕埋点的大概实现,以及所使用到的技术,若需使用到项目中还需更深入的研究。

有人可能会问这几种埋点方式用哪种好?对一般的创业团队来说,直接接第三方的埋点就可以,基本都是代码埋点+可视化埋点;当然有能力的团队可以按需打造自己的埋点平台。

参考:网易HubbleData之Android无埋点实践

你可能感兴趣的:(移动端埋点分析)