Android 打点方式总结

来源:互联网 发布:千里眼软件下载 编辑:程序博客网 时间:2024/06/05 05:38

打点的痛点

打点是由用户操作,引起视图变化,在记录视图变化时的业务数据信息,以供产品、运维分析。所以打点既包括视图逻辑,也包括业务逻辑,这是蛋疼的地方。我们在开发的时候,一直致力于业务逻辑和视图逻辑要分离,而打点非要将他们糅合在一起……
总结一下打点的几个痛点:
1、与业务代码耦合(回调打点)
2、与视图逻辑耦合(点击点必须写onclick)
3、曝光点逻辑多、复杂
4、没法在发版之后打点(产品开发时不关心打点,发版前突然关心!)

耦合问题

思路,选择与视图和逻辑一方耦合,采用声明式,这样会较少代码恶心程度,利于维护。

1、选择与业务逻辑耦合

视图逻辑用钩子,在业务逻辑代码声明打点。问题是如何描述视图,目前没有看到完美的方式,

有两种方案:

a、View树路径定位+声明Tag名称方式

即使用ViewPath+TagName唯一确定一个View。

b、ViewID + TagName

总结:两者各有利弊,如果在业务逻辑声明View的Click点,最好用b方案;但如果后台生成打点,a方案更好。自己体会吧!

2、选择与视图耦合

视图逻辑用钩子,将打点逻辑给视图的tag。问题是视图以后复用的话,打点逻辑需要适配新的业务数据。
这种方案更简单可行,将打点信息给View的Tag,在点击时在钩子里面自动打点了。

3、钩子

说了半天,Click点的钩子怎么设置,什么是Click时候的钩子?就是用户在点击时,能够截获点击事件。这里总结了三种方式,可行性都很好,看你的选择了:

a、运行时方案:复写所有的原生View

例如:
View——》MoonView
LinearLayout——》MoonLinearLayout
………………
干什么呢?把它的PerformClick方法截获,插入你的打点逻辑。然后规范所有这个APP的开发者,使用的View必须是包装过的View!这种方案对于大型项目就不好了,除非在线上打包时加上静态检查,否则很难推广。

b、运行时方案:在你的Activity或者框架中给所有的View添加AccessibilityDelegate

这是google提供的无障碍使用接口,你不知道怎么用就去百度吧,在AccessibilityDelegate中可以截获Click事件,但是你的View不要把AccessibilityDelegate功能关闭。还有在设置AccessibilityDelegate时,最好先通过反射方式getAccessibilityDelegate(),如果有人已经设置了AccessibilityDelegate最好不要覆盖它,可以写个代理的AccessibilityDelegate然后再设置,这些坑不要说我没告诉你!

c、编译时方案:gradle脚本

写个gradle插件,在编译时找到所有的OnClicklistener,然后hook掉Onclick,把打点代码注入进去!很简单很暴力,并且毫不侵入。

本人建议使用c方案!

曝光打点

首先,我们要理清曝光打点有哪些逻辑,然后将曝光打点逻辑参数化,最后定义接口,适配不同容器(统一容器最优雅)

1、曝光打点逻辑

总结几个维度:延迟、移入、移除、间隔、是否完全。

2、定义接口:

3、容器

最好你的APP只是用一种页面容器,现在最好的选择是RecyclerView,虽然RecyclerView相比ScrollView在非复用页面性能略差,但在现在主流手机体验差不多。所以建议APP所有Native页面统一采用RecyclerView。
RecyclerView如何知道这些时机呢?我想这些都不是问题……

终极方案

终极方案就是本地将View曝光、点击行为以及View的描述统统上报,后端结合当时的数据、行为和View的描述生成打点数据。不用发版、不用写任何打点代码就能搞定啦!
终极方案其实依赖以上几步的实现,View描述、钩子、曝光打点。

原创粉丝点击