Android 大数据收集 全埋点 自动统计 数据批量统计上报

框架知识
注解和反射和代理模式
 
 
解决的问题
1.数据不丢失,杀死进程的时候
2.批量上报,数据存储
3.上报的频率控制
4.性能问题
 
 

移动平台数据上报是很常见的需求。常见的实现方式是,

1. 创建一个带队列的线程。

2. 把要上报的数据抛入线程队列中。

3. 数据过多本地写入文件。

4. 线程异步开始上报。

5. 上报完成后删除本地文件。

但这个实现方案经常会有一些问题:

1. 上层写入数据过快,写文件线程来不及写入文件,此时应用发生crash或app被杀,导致上报数据丢失。

2. 多业务场景很难复用

3. 文件序列化经常出现问题,导致数据丢失

4. 不跨平台,安卓和iOS通常出现不同的实现,总是各自出现不同的问题,不容易定位,统一解决

因为我们对数据要求很高,完全不允许数据出现丢失。所以针对上面这种方案的实现是不允许的。所以我们针对这种不允许数据丢失的需求,开发了一套准实时数据上报组件:DataReporter 


 
 
方案采用
 根据公司的需求以及对app的规模,只需实现控件按钮点击事件的监听,但是对控件的点击事件处都添加代码,工作量是有点大,所以我们采用控件自动化埋点的方法来统计,只需在BaseActvity中重写dispatchTouchEvent,在xml布局中给需要统计点击事件的控件添加tag标签即可,并不需要在每一个OnClickListener的地方加入拦截代码。
————————————————
自动化埋点存在的问题和难点
像有些布局我们可以通过该方法获取到被点击的控件,但是对于某些控件却找的不够准确,比如我在listview的header布局,那么它就找不到上面的控件,显示的fucName都是同一个,并且对于一些隐藏的控件,弹出窗口等都不好处理,那么这个UI路径作为唯一标识,那也就没办法自动埋点了,只能通过手动埋点来补充。
并且制动埋点的定制还需要自己写代码生成一个埋点列表,需要人工去查看比对,若一些控件布局经常发生变化,每一次都要重新找埋点控件的UI路径,也是相当麻烦的,并且在不同android版本会造成控件的UI路径不同,自动化埋点还存在很多的坑,还有很大的难点要克服。
 
————————————————
版权声明:本文为CSDN博主「Mr1_liu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/laizixingxingdewo/article/details/79276633
 
 
在很多地方我们可以看到AspectJ的身影,例如JakeWharton大神贡献的一个注解日志和性能调优框架 Hugo ,在Spring框架里面也有应用到AspectJ的概念
 
全埋点
http://ju.outofmemory.cn/entry/338292
 
 
Mixpanel SDK内部采用一条HandlerThread线程来处理事件,当开发者调用 track(String eventName, JSONObject properties) 方法时, 主线程切换到HandlerThread 当中,并先将事件存入数据库。然后看SDK中是否累计到了40个事件,如果累计到40个事件的话,就合并它们上报到后台。
 
通过静态或者动态的方式,“Hook”了原有的App代码 ,从而实现了行为的监测,在数据上报时通常是采用累积多条再上报的方案来合并请求
 
 
    1.主页面各tab事件(ok)
    2.运动模式各个控件点击事件(ok)
    3.赛事tab页面各个控件的点击事件(ok)
    4.跑步tab的点击事件====添加到了新运动方式里面(ok)
    5.看看tab页面各个控件的点击事件
    6.我的tab页面各个控件的点击事件(ok)
 
 
1.首页的热门活动事件 187,7    ,地址有说明上报的id参数
2.资讯209,15   添加新闻id上报
3.赛事顶部banner点击改成单独的208,8   
 
 
上报优化,增加抗风险,节省用户流量和耗电量,主要更改内容如下
1,biz数据上报的频率控制,目前默认设置2秒
2,批量上报,默认累积到5条再上报;
3,可以再cms配置某一个biz
 
参数配置地址:
 
report_rate:上报频率,2s内重复事件不上报
report_length:多少条记录上报一次
report_info:{"notreport_bizlist":[{ "biz_id":"175"}],"isBatchReport":true,"isFilter":true} 
notreport_bizlist:不上报的biz     isBatchReport:是否批量上报     isFilter:是否过滤不上报的列表
 
 
 

 

你可能感兴趣的:(架构)