Android AOP浅析

作者: EasyLife90 | 来源:发表于2018-02-06 17:19 被阅读0次

AOP 是 Aspect Oriented Programming的缩写,我们意为“面向切面编程”。我们平时也称为“注解”。
我们多数用来进行用户行为的统计。废话少说,直接上码。

1.首先创建一个BehaviorTrace.java 的interface类 如下

package com.example.zkq.myapplication.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Created by ZKQ on 2018/1/26.
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface BehaviorTrace {
    String  value();
}

2.创建BehaviorAspect.java类来实现方法。

package com.example.zkq.myapplication.aspect;
import android.util.Log;
import com.example.zkq.myapplication.annotation.BehaviorTrace;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
/**
 * Created by ZKQ on 2018/1/26.
 */
@Aspect
public class BehaviorAspect {
  private final static String PATH = "execution(@com.example.zkq.myapplication.annotation.BehaviorTrace * *(. .))";
    @Pointcut(PATH)
    public void methodWithBehaviorTrace() {
    }
    // @Before 切入點之前执行
    //@After()  切入点之后
    //@Around 切入点之间。
    @Around("methodWithBehaviorTrace()")
    public Object weaveJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable {
        MethodSignature methodSignature= (MethodSignature) joinPoint.getSignature();
        String  className=methodSignature.getDeclaringType().getSimpleName();
        String methodName=methodSignature.getName();
        BehaviorTrace behaviorTrace=methodSignature.getMethod().getAnnotation(BehaviorTrace.class);
        String value=behaviorTrace.value();
        long begin = System.currentTimeMillis();
        Object result = joinPoint.proceed();
        long duration = System.currentTimeMillis() - begin;
        String contentStr=String.format("%s类的%s方法被执行,%s耗时%d",className,methodName,value,duration);
        Log.i("zkq",contentStr);
        return result;
    }
}

3.最后在你想要监听的事件上添加注解就ok了。

    @BehaviorTrace("视频消息")
    public void onAudio(View view) {
    SystemClock.sleep(new Random().nextInt(500));
    }
    @BehaviorTrace("语音消息")
    public void onVoice(View view) {
  SystemClock.sleep(new Random().nextInt(500));
    }

4.最重要的一部是配置你项目build.gradle。

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.aspectj:aspectjtools:1.8.13'
        classpath 'org.aspectj:aspectjweaver:1.8.13'
    }
}


final def log = project.logger
final def variants = project.android.applicationVariants

variants.all { variant ->
    if (!variant.buildType.isDebuggable()) {
        log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")
        return;
    }

    JavaCompile javaCompile = variant.javaCompile
    javaCompile.doLast {
        String[] args = ["-showWeaveInfo",
                         "-1.5",
                         "-inpath", javaCompile.destinationDir.toString(),
                         "-aspectpath", javaCompile.classpath.asPath,
                         "-d", javaCompile.destinationDir.toString(),
                         "-classpath", javaCompile.classpath.asPath,
                         "-bootclasspath", project.android.bootClasspath.join(File.pathSeparator)]
        log.debug "ajc args: " + Arrays.toString(args)

        MessageHandler handler = new MessageHandler(true);
        new Main().run(args, handler);
        for (IMessage message : handler.getMessages(null, true)) {
            switch (message.getKind()) {
                case IMessage.ABORT:
                case IMessage.ERROR:
                case IMessage.FAIL:
                    log.error message.message, message.thrown
                    break;
                case IMessage.WARNING:
                    log.warn message.message, message.thrown
                    break;
                case IMessage.INFO:
                    log.info message.message, message.thrown
                    break;
                case IMessage.DEBUG:
                    log.debug message.message, message.thrown
                    break;
            }
        }
    }
}

5. jar下载地址 aspectjrt.jar

初次使用Markdown,之前都没用。这样写起来感觉好漂亮好整齐。处女座的我、、哈哈哈拜拜。

相关文章

  • Android AOP浅析

    AOP 是 Aspect Oriented Programming的缩写,我们意为“面向切面编程”。我们平时也称为...

  • Spring 学习--AOP

    参考文献:深入浅析Spring 的aop实现原理Spring AOP 深入剖析AOP: 面向切面编程oop是从上往...

  • 基于Android 的Log机制

    基于Android N的Log机制浅析 上篇 基于Android N的Log机制浅析 下篇 android log...

  • 移动架构<第五篇>:AOP架构设计

    Android之AOP架构<第一篇>:入门Android之AOP架构<第二篇>:按钮防抖Android之AOP架构...

  • Android构建过程分析

    Android构建过程分析浅析 Android 打包流程

  • 浅析AOP(二)——简单应用

    前戏《浅析AOP(一)——基本概念》已经准备好了前置认识。 本篇再剖析一下AOP。 SpringAOP的底层技术 ...

  • Android aop Advice(通知、增强)

    推荐阅读系列文章 Android aop切点表达式(execution)Android aop(AspectJ)查...

  • AOP浅析

    序言 最近在做一个spring boot的web应用,在解决日志处理的问题的时候需要用到AOP编程,作为sprin...

  • 浅析AOP

    对AOP的简单理解 AOP就是面向切面编程,这种方式让我们有更多精力放在核心业务逻辑上,下面这个图可以方便我们理解...

  • 浅析 aop

    一、什么是aop? aop是面向切面编程。aop是oop的延续,oop的重点在于具体领域模型的抽象,而aop则是针...

网友评论

    本文标题:Android AOP浅析

    本文链接:https://www.haomeiwen.com/subject/aewgzxtx.html