项目埋点配置

       最近做项目 遇到一些埋点的需求,需要对相关点击事件,进行点击次数等用户行为的大数据统计。为了统一处理,对埋点使用了代理技术(也有使用其他技术的比如gradle自动配置注入属于无代码配置那种),工具类代码如下

package com.ytg.panasonic.tools;

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;

import java.lang.reflect.Field;

/**
* Created by ytg on 2018/1/11.
*/

public class HookUtils {
private static final String VIEW_CLASS = "android.view.View";

public static void hookListener(Activity mActivity, OnClickListener onClickListener) {
if (null != mActivity) {
View view = mActivity.getWindow().getDecorView();
getView(view, onClickListener);
}
}

public static void getView(View view, OnClickListener onClickListener) {
if (view instanceof ViewGroup) {
for (int i = 0, count = ((ViewGroup) view).getChildCount(); i < count; i++) {
getView(((ViewGroup) view).getChildAt(i), onClickListener);
}
}
viewHook(view, onClickListener);
}

public static void viewHook(View view, OnClickListener onClickListener) {
try {
Class viewClass = Class.forName(VIEW_CLASS);
Field feild = viewClass.getDeclaredField("mListenerInfo");
feild.setAccessible(true);
Object mListenerInfo = feild.get(view);//view对象中的mListenerInfo实例
           if (null != mListenerInfo) {
Class listenerInfo2 = Class.forName("android.view.View$ListenerInfo");//反射创建listenerinfo
               Field clickfeild = listenerInfo2.getDeclaredField("mOnClickListener");
clickfeild.setAccessible(true);
View.OnClickListener lis = (View.OnClickListener) clickfeild.get(mListenerInfo);
if (lis != null) {
View.OnClickListener lisproxy = new OnClickListenerProxy(lis, onClickListener);
clickfeild.set(mListenerInfo,lisproxy);//设置代理
               }
}
} catch (Exception e) {
e.printStackTrace();
}
}

public interface OnClickListener {
void beforeInListener(View v);

void afterInListener(View v);
}

public static class OnClickListenerProxy implements View.OnClickListener {
private View.OnClickListener lis;
private HookUtils.OnClickListener mListener;

public OnClickListenerProxy(View.OnClickListener lis, OnClickListener mListener) {
this.lis = lis;
this.mListener = mListener;
}

@Override
       public void onClick(View v) {
if (mListener != null) {
mListener.beforeInListener(v);
}
if (lis != null) {
lis.onClick(v);
}
if (mListener != null) {
mListener.afterInListener(v);
}
}
}
}

使用方法:

activity 或者fragment implements View.OnClickListener,HookUtils.OnClickListener

然后

textv.setOnClickListener(this);
HookUtils.hookListener(this,this);//这个得放在最后执行 可以封装在基类里边统一调用
,也可以根据自己的业务场景 进行改造。
@Override
public void beforeInListener(View v) {
Log.i("URI","beforeInListener");
}

@Override
public void afterInListener(View v) {
Log.i("URI","afterInListener");
}

@Override
public void onClick(View v) {
Log.i("URI","onClick");}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot项目中的埋点功能通常用于收集应用程序运行时的各种事件数据,以便于监控、分析和优化。实现步骤可以概括如下: 1. **选择埋点工具**:Spring Boot支持集成各种第三方的AOP(Aspect Oriented Programming)框架,如Logback、Log4j2、Zipkin等,也可以自定义日志或者使用像Elasticsearch、Jaeger这样的分布式追踪服务。 2. **创建事件监听器**:使用Spring AOP的@Around注解,编写切面(Aspect),对关键业务操作或API请求进行拦截,并记录相关信息,比如方法名、参数、返回值、耗时等。 ```java @Around("execution(* com.example.service.*(..))") public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); // 执行目标方法 long endTime = System.currentTimeMillis(); // 记录日志或发送数据到服务器 log.info("Service method {} called with parameters {} and took {} ms", joinPoint.getSignature().getName(), joinPoint.getArgs(), (endTime - startTime)); return result; } ``` 3. **配置数据发送**:如果采用日志存储,可以配置相应的日志文件滚动策略;如果是实时上报,可能会设置HTTP客户端或者消息队列将埋点数据发送到后端处理。 4. **异常处理**:考虑到系统稳定性和错误报告,需要处理可能出现的异常,确保埋点信息的完整性。 5. **测试验证**:通过单元测试和集成测试确认埋点功能是否正常工作,并查看生成的数据能否反映出预期的业务流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值