Android AOP 面向切面编程实现用户行为统计
背景与原理
在 Android 应用开发中,用户行为统计是非常重要的一部分。如何做到用户行为的统计呢?比较笨的方法是在需要统计的行为(例如朋友圈、语音等)的代码中直接打印 Log,但这样做非常麻烦,而且工作量很大,容易导致代码耦合度高且难以维护。
有没有更好的方法呢?答案就是通过 AOP(Aspect Oriented Programming,面向切面编程)。AOP 允许将那些与业务逻辑无关但为多个对象所共用的功能封装起来,减少重复代码,提高系统的可维护性。
环境配置
首先,需要在项目中引入 AspectJ 相关的依赖。通常使用 AspectJX 插件来简化 Android 中的 AOP 集成。
在 build.gradle (Module: app) 中添加以下配置:
plugins {
id 'com.hujiang.aspectjx'
}
android {
// ... 其他配置
}
aspectjx {
include '**/*.class'
}
dependencies {
implementation 'org.aspectj:aspectjrt:1.9.7'
implementation 'org.aspectj:aspectjweaver:1.9.7'
}
确保项目根目录的 build.gradle 中包含 AspectJX 插件类路径。
定义自定义注解
我们需要编写一个注释类 BehaviorTrace,用来标识方法是否要被追踪和统计。
// 保留策略为运行时,以便反射获取
@Retention(RetentionPolicy.RUNTIME)
// 目标为方法
@Target(ElementType.METHOD)
public @interface BehaviorTrace {
String value();
}
编写用户行为切面
接下来创建切面类 BehaviorAspect,利用 AspectJ 的注解来拦截带有 BehaviorTrace 注解的方法。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
@Aspect
public class BehaviorAspect {
// 定义切点:匹配所有被 BehaviorTrace 注解修饰的方法
@Pointcut("execution(@com.example.aopdemo.BehaviorTrace * *(..))")
public {
}
Object Throwable {
(MethodSignature) joinPoint.getSignature();
methodSignature.getDeclaringType().getSimpleName();
methodSignature.getName();
methodSignature.getMethod().getAnnotation(BehaviorTrace.class);
behaviorTrace.value();
System.currentTimeMillis();
;
{
result = joinPoint.proceed();
result;
} {
System.currentTimeMillis() - beginTime;
android.util.Log.d(, String.format(,
funName, className, methodName, duration));
}
}
}


