关于对自动埋点的学习

  • 背景
  • 自动埋点的应用场景
  • View 唯一标识
  • 标识的目的
  • 解决方案xpath
  • xpath原理
  • xpath实现
  • 通过view获取xpath和在UIAutomator定位Android控件Xpath路径
  • xpath优缺点及解决方案
  • 优点
  • 缺点
  • 优化解决方案
  • 事件拦截
  • 事件拦截的目标
  • 事件拦截的方式
  • 代理监听
  • 编译期插桩
  • 业务数据搜集
  • 方案 OnClick事件数据搜集
  • 实现在内部类中找到自己想要的数据


背景

自动化埋点是相比较与手动插桩手动埋点之后提出的更加低侵入的方法。

自动埋点的应用场景

用户数据上报。根据业务需求,通过下发配置进行进行埋点收集

数据搜集的内容.

一种是应用的事件:

androidstudio怎么看埋点日志 android埋点是什么_解决方案


一种是app的业务数据以及其他数据。

View 唯一标识

标识的目的

应用的视图需要对页面中的view 进行唯一标识。标识的目的是让view在页面上具有区分性和一致性。

  • 区分性: 让view 在视图上与其他的view 进行区分
  • 一致性: 在同一个页面 view的标识唯一,无论应用环境、多次进入同一个页面

解决方案xpath

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初XPath的提出的初衷是将其作为一个通用的、介于XPointer与XSL间的语法模型。但是XPath很快的被开发者采用来当作小型查询语言。

xpath原理

Android中xpath路径:

androidstudio怎么看埋点日志 android埋点是什么_事件拦截_02


IOS中xpath路径:

androidstudio怎么看埋点日志 android埋点是什么_解决方案_03


web页面中的xpath表示路径: /html/body/div[4]/div/div[2]/span

androidstudio怎么看埋点日志 android埋点是什么_事件拦截_04

xpath实现

通过view获取xpath和在UIAutomator定位Android控件Xpath路径

可以定义xpath的表示: 页面/+ viewPath/ + 其他匹配规则/

androidstudio怎么看埋点日志 android埋点是什么_数据_05


可以通过View的父亲节点和与兄弟节点的相对位置获取 视图View的viewPath路径

xpath优缺点及解决方案

优点
  • 埋点的自动化可新增
  • 对代码非侵入
  • xpath表示语法支持IOS、Android、Web等多端
缺点
  • 对于动态化的界面,如果ViewTree中的节点被新增和删除会导致viewPath改变
  • xath的语言较复杂
优化解决方案

对于列表类型的确定子视图在父中的位置还可以通过Position来定位
可以添加页面信息+空间Tag/Id来更准确的定位

事件拦截

事件拦截是指应用发生的各种事件进行拦截处理。

事件拦截的目标

拦截处理的事件包括应用的启动、前后台、页面的显隐、最主要的是页面上的点击事件以及条目的浏览。
拦截事件后将有效的业务数据进行上报来进行app分析(bug分析、页面优化)、用户分析(推荐、行为预测)

事件拦截的方式

拦截的方式主要是AOP思想:
在Android开发过程中,我们经常会在我们的具体业务代码中加入全局性、系统性的与具体业务无关的代码。比如埋点、动态申请权限等等。AOP的思想就是将这些与业务无关的系统性的功能解耦出来,让代码看起来更清晰一点。

代理监听

代理监听这里指的是手动插桩,一般手动插桩无法全方位覆盖,对代码造成侵入。

编译期插桩

编译期插桩提供的实现技术有很多:

  • 静态代理 和 运行期注解 + 动态代理
  • 编译时代码生成(APT),案例:ButterKnife,Dagger2,Room
  • 切面编程库(AspectJ),案例:Hugo
  • 字节码注入(ASM),案例:GrowingIO(无埋点上报框架)
    其中ASM插桩方案的侵入最小

业务数据搜集

业务数据收集是最终要实现的目标

方案 OnClick事件数据搜集

一般的业务数据收集是在用户的点击事件后,在点击事件通常是监听过程,我们可以在关联的onClick监听中获取其中引用到的数据
问题转化成了:如何在OnClick中获取需要的引用数据

实现在内部类中找到自己想要的数据

因为监听事件以内部类的形式进行注入。在内部类使用外部数据的时候会在内部类实现中引用这个数据。问题再次转化为实现内部类的实现类的成员变量。

androidstudio怎么看埋点日志 android埋点是什么_事件拦截_06


androidstudio怎么看埋点日志 android埋点是什么_数据_07