Android无痕埋点开源,android无痕打点 aop+databing实现android无痕埋点

1.前提

业务中常常须要对全部的打击事件作统计, 最简单的就是在每一个click处加上本身的代码, 或者全继承本身的view, 这些都跟业务耦合性过高,除了一些特殊的点,可能大部分点都是android

能够用通用打点的方式来实现, 利用AOP 切面 将打点在编译前从业务中剥离出去,甚至打点数据直接从服务器下发,或者直接经过gradle脚本动态读取PM的打点文档实现自动注入git

Android无痕埋点开源,android无痕打点 aop+databing实现android无痕埋点_第1张图片

2.打点

一.通用点

通常是跟界面有关系的, 当前点处于哪一个activity, fragment, 这里咱们能够经过实现 通用的接口, 将界面通用点放入方法中,这个通常都能在基类中实现, 而后在AOP模块中拿到对应数据,github

若是想彻底解耦,甚至能够经过反射的方式拿到通用打点数据缓存

二.元素特殊点

好比咱们须要知道当前元素处于列表中的位置,或者当前元素的名称,点击时间之类服务器

这边介绍的都是经过databinding 绑定的事件 ,由于比较通用,若是你界面里用 setOnClickListener 的话能够用aop切全局app

android:text="@{module.name}"

app:bindClickData='@{"name:" + module.name + ",position:" + position}'

android:textSize="20sp"

android:onClick="@{(view)->click.onMainClick(module,view)}"

android:padding="20dp"/>

app:bindClickData 是自定义的databind事件,这里 主要是为了传递一些item自有的参数,

这里能够看到我主要传了当前item的 名称 和在列表中的位置

public class BindAppUtils {

@BindingAdapter("bindClickData")

public static void bindClickData(View view, String data) {

Log.e("lin","bindData="+data);

view.setTag(R.id.snow_click_id,data);

}

}

这个就是自定义的绑定事件, 咱们经过view.setTag 把特殊打点数据缓存到view中性能

android:onClick是view的普通点击事件,

databind全部click事件都会走generatedJava 目录下

你的包名.generated.callback.OnClickListener

@Before("execution(* com.lin.aopdemo.generated.callback.OnClickListener.onClick(..))")

public void onCommonClick(JoinPoint joinPoint) throws Throwable {

View view = (View)joinPoint.getArgs()[0];

Log.e("lin","onClick="+joinPoint.getThis());

if(view.getContext() instanceof ClickInter){

ClickModel.INSTANCE.doClick(view,((ClickInter)view.getContext()).getPageParam());

}

}

这里是切面方法,就是对应的点击view, 这里取了界面的通用参数, 若是要彻底解耦,能够用反射获取getPageParam(),固然 直接取性能会比反射好gradle

fun doClick(view: View, m: Map) {

var data = view.getTag(R.id.snow_click_id) as String

var map = mutableMapOf()

map.putAll(m);

data?.split(",").forEach {

if(it.contains(":")){

map.put(it.split(":")[0],it.split(":")[1])

}

}

Log.e("lin",map.toString())

}

具体的点击方法  咱们经过view.getTag拿到前面 databing塞进去的特殊数据, 所有塞到一个map中,从而完成一次打点spa

后面具体经过什么 方法忘平台传数据 能够本身定义

具体能够看顶部的源码, 例子比较简单,具体需求能够按照这种思路扩展

你可能感兴趣的:(Android无痕埋点开源)