小米统计SDK打点使用方法

Posted by Chejdj Blog on August 26, 2018

这一周又过得非常快,眨眼之间就过去了,目前自己参与的App也已经发灰度了,估计下周就要正式发版,里面有自己写的代码(基本思路都是问导师实现的)还是挺激动的。下面分享一下,这几天学习的内容.

小米统计SDK打点使用方法

Session: 从用户打开应用开始到离开应用并且超过30秒结束,属于一次用户统计一次
要求:需要开发者在用户进入应用每个界面的时候,调用recordPageStart方法,离开该界面的时候,调用recordPageEnd方法,所以建议 在onResume和onPause调用这两个方法
页面访问的数据记录:recordPageStart和recordPageEnd两个方法记录

   MiStatInterface.recordPageStart(Context context,MY_PAGE_NAME)

第一个就是自己的activiy,fragment,service等,第二个为每一个页面设置名称。

一. 自定义事件

自定义事件有4个属性:

  1. 类别(String): 方便打点事件的归类,我们项目有三种类型
    DEFAULT(0) ,OPERATION 运营关注的点,DEV开发关注的,可以为空
  2. 主键(String):自定义事件的主键,作为事件的唯一标识
  3. 值(value):自定义事件的值,有字符串和数值两种类型
  4. 类型(type):自定义事件类型:计数(count),计算(calculate),字符串属性(string property)和数值属性(numeric property)
  5. 事件参数arg,我们可以额外为这个事件增加一些参数,比如性别,年龄之类的,使用map存储。

二. 自定义事件的类型

计数类型 一个事件的发生的累积次数,按钮点击,界面进入,用户输入等
计数类型数据的value隐式的被设置为 1
作用:计算该类事件总发生次数,总体覆盖用户数等等 上报该类型的代码:

1
2
MiStatInterface.recordCountEvent(String category,String eventid);
MiStatInterface.recordCountEvent(String category,String eventid,Map<String,String> args);

计算类型 一个带有数值的事件发生,例如:消费事件自带消费金额,下载事件自带下载时间长度文件大小等
作用:对该类事件累加,分布,按次平均,按人平均等等 上报该类型事件的代码:

1
2
MiStatInterface.recordCalculateEvent(String category,String eventid,long value);
MiStatInterface.recordCalculateevent(String category,String eventid,long value,Map<String,String>args);

字符串属性类型 描述某个具备字符串类型的属性,记录用户性别,职业,爱好等等
特点:对于一个设备,同一个主键的字符串值,只会保留一份,只统计最新的属性
而且注意没有Map自带的参数

1
MiStatInterface.recordStringPropertyEvent(String category,String eventid,String value);

数值属性类型 描述具备数值特征的属性 用户年龄,工作年限,等等
特点:和字符串属性类型一样

1
MiStatInterface.recordNumericEvent(String category,String eventid,long value);  

测试自己打点是否生效:先获取本设备的deviceID通过MiStatInterface.getDeviceID(Context context)然后在网站上添加就好了

三.额外的功能: 实时网络监控 URLStatsRecorder

URLStatsRecorder.enableAutoRecord 自动实现对HTTPURLConnection和HTTPsURLConnection网络访问信息的自动采集,某次HTTP请求的时长,成功失败等,按照地域,网络,运营商等等纬度展示请求次数,时长,成功率等
public static void addHttpEvent(HttpEvent event)
弥补之前的不足,可能该链接为socket,HttpClient等等之前不会自动采集,对某个特殊的URL实现监控

HTTPEvent的构造函数
 public HttpEvent(String url,long timeCost)
 public HttpEvent(String url ....)

public static void setEventFilter(HttpEventFilter eventfilter)
SDK采集的数据经过eventfilter处理再上传,默认的filter去掉url的参数,只保留问号之前的部分
使用大致的方法就是:

1
2
3
4
5
6
7
URLStatsRecorder.setEventFilter(new HttpEventFilter(){
     @Override
    public HttpEvent onEvent(HttpEvent httpEvent){
        //对这里面的httpevent进行修改之类的 getUrl setUrl,setNet之类的修改
   }

})

盟统计各个方法

友盟和之前的自定义事件高度相似,只是对于事件的属性中没有类别这个属性,但是在操作栏有许多的事件可以监控: 比如: 漏斗分析:定义一系列的事件 A-B-C—D 来监控这一系列事件
比如:“浏览商品-加入购物车-提交订单-付款成功” 这一系列事件,我们可以了解多少人加入购物车,从购物车到提交订单的转化率是多少等等
事件细分:1.分析某事件随时间的变化 2.查找符合某类刷选条件的事件 3.多事件分析,通过对比相同时间范围内不同事件变化的
自定义留存选择初始事件,回访事件
比如:新增的用户在之后每天打开APP看完一篇文章的用户多少,用户二次打开APP的情况
用户分群 分群推送

在该方法中的使用:
对于计数类型 StatisUtil.getInstance.reportClickEvent(String eventid,Map<String,String>args)之类的 StatisUtil.getInstance.reportEvent(String eventid,category,Map)
对于计量类型
StatisUtil.getInstance.reportCalculateEvent(eventid,size,args)
相比较而言 小米的定制功能上就比较少,用户分群 但是小米有一个比起友盟有一个对Url的流量,连接时间,请求成功失败的统计

目前市场上主流的埋点方案

  1. 代码埋点: 在事件发生时调用,使用代码发送数据,比较有名的SDK:友盟
  2. 可视化埋点:通过可视化工具配置采集点,然后Android端自动解析配置并上报埋点数据。目前现有的方案就是,开启可视化埋点模式之后,SDK会隔一段时间做一次截图,截图的同时,从该界面的rootView开始遍历它所有的子View(子View用ClassName等属性标识),然后服务器根据截屏和view的信息,重新在后台绘制出来,然后就在后台配置采集点,生成配置文件,android端获取配置文件信息,代表SDK:Mixpanel
  3. 无埋点: Android端自动采集全部事件并上报埋点数据,在后端过滤,第一种是设置代理,在BaseActivity里面收集所有的View的事件,然后给每一个View设置View.AccessibilityDelegate,每当View响应某个事件的时候,都会发送消息给该View的AccessibilityDelegate,第二种利用Gradle插件,利用Android gradle插件提供的最新的Transform API,在Apk编译环节汇中,class打包成dex之前,插入中间环节,对class文件的字节码进行扫描,扫描到目标事件响应函数时,在函数头部或尾部插入事件上传的代码

各个方案的优缺点

  1. 代码埋点: 代价大每一个埋点都需要写代码,而且埋点方案改变就会导致首先代码需要修改,然后发版但是可能用户不喜欢升级APP就会无效,方案优点:控制可以比较精准,我们可以设置一些自定义属性,事件等数据到给服务端
  2. 可视化埋点:对于事件的描述比较少,覆盖功能有限 优点:解决了代码埋点的代价大和更新代价大的问题
  3. 无埋点:解决数据回溯问题,覆盖功能有限,不能灵活的自定义属性,给网络传输和耗电性能带来了负载