面向切面编程-Aspect Oriented Programming,简称AOP,通过预编译的方式运行期间动态代理实现程序功能的统一维护的一种技术。

AOP能够做什么呢?

  • 性能检测
  • 权限验证
  • 释放资源
  • 用户行为统计

这个技术当进行性能调优的时候特别好用,配置好了只需要添加一个注解就能控制是否需要输入耗时等信息,特别容易控制,快来看看如何配置吧。

那么AOP如何使用呢?

前期准备工作

1.在主工程的build.gradle增加编译配置

//增加编译规则
buildscript {repositories {mavenCentral()}dependencies {classpath 'org.aspectj:aspectjtools:1.8.8'classpath 'org.aspectj:aspectjweaver:1.8.8'}
}//为了方便看到日志输出
import org.aspectj.bridge.IMessage
import org.aspectj.bridge.MessageHandler
import org.aspectj.tools.ajc.Mainfinal def log = project.logger
final def variants = project.android.applicationVariantsvariants.all { variant ->if (!variant.buildType.isDebuggable()) {log.debug("Skipping non-debuggable build type '${variant.buildType.name}'.")return;}JavaCompile javaCompile = variant.javaCompilejavaCompile.doLast {String[] args = ["-showWeaveInfo","-1.8","-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.thrownbreak;case IMessage.WARNING:log.warn message.message, message.thrownbreak;case IMessage.INFO:log.info message.message, message.thrownbreak;case IMessage.DEBUG:log.debug message.message, message.thrownbreak;}}}
}

2.然后在libs 下面添加 aspectjrt.jar

下面进入是具体实现

  • 定义一个注解,用来标识哪些是需要统计的。
  • 将相应的注解添加到需要统计的方法上
  • 定义切面规则
    • 在原来应用中的哪些注释的地方放到切面进行处理
    • 对进入切面的内容如何处理

现在有这样一个需求,客户要求统计轮廓线各个特效的耗时情况

  • 获取轮廓线耗时
  • 单独矢量化的耗时
  • 矢量化后增加单色渲染耗时
  • 矢量化后增加渐变色颜色耗时
  • 矢量化+粉笔+单色耗时
  • 矢量化+粉笔+渐变色耗时
  • 线条矢量化+荧光笔+单色耗时
  • 线条矢量化+荧光笔+渐变色耗时
  • 线条矢量化+单色渲染+网点耗时
  • 线条矢量化+单色渲染+排线耗时

如果不采用AOP,就需要在方法前后添加时间戳,copy很多重复的代码才可以,下面通过AOP来处理。

3.定义一个注解类

@Target(ElementType.METHOD)  //使用在方法上
@Retention(RetentionPolicy.RUNTIME) //到运行期间都要存在
public @interface BehaviorTrace {String value();}

用来标识哪些地方需要统计性能标识

4.标识需要统计性能的方法

/*** 对图片进行矢量化*/
@BehaviorTrace("矢量化操作")
public void vectorBitmap() {if (mLineBitmap == null) {Log.e("meicam", "mLineBitmap is null");return;}String lineJsonStr = mImageEffectContext.getVectorDataFromImage(mLineBitmap, -0.6f);mVectBitmap = mImageEffectContext.renderVectorEffect(mLineBitmap, lineJsonStr, mSrcImageWidth, mSrcImageHeight);ivImage.setImageBitmap(mLineBitmap);
}/*** 渐变色*/@BehaviorTrace("渲染渐变色")private void gradientColor() {if (mVectBitmap == null) {Log.e("meicam", "mLineBitmap is null");return;}Bitmap bmp = mImageEffectContext.renderColorEffect(mVectBitmap, Color.RED,Color.WHITE,Color.GREEN, mSrcImageWidth, mSrcImageHeight, true, false);ivImage.setImageBitmap(bmp);}

像上面这个方式标记需要统计的方法

3.写切面类

@Aspect
public class BehaviorAspect {//切面规则//1.在原来的应用中哪些注释的地方放到切面上 @Pointcut("execution(@com.meishe.imageshow.annotation.BehaviorTrace * *(..))")public void fromBehaviorTrace(){}//2.对进行切面的进行处理//@Before  触发之前调用//@After 触发之后调用//@Around   触发期间调用@Around("fromBehaviorTrace()")public Object joinPoint(ProceedingJoinPoint joinPoint) throws Throwable{MethodSignature signature = (MethodSignature) joinPoint.getSignature(); //方法签名String methodName = signature.getName(); //方法名String className = signature.getDeclaringType().getName();String value = signature.getMethod().getAnnotation(BehaviorTrace.class).value();//统计时间long beginTime=System.currentTimeMillis();Object proceed = joinPoint.proceed();long duration=System.currentTimeMillis()-beginTime;Log.d("lpf",String.format("%s-->%s-->%s-->耗时%d ms",className,methodName,value,duration));return proceed;}}

上面是实际项目中的两个方法,我分析耗时的一个配置方式。
这样就可以输出对图片进行矢量化方法的耗时以及渐变色的耗时了,这里的数据也可以写入到本地文件,推送到服务器等。如果想测试其他方法的耗时直接在方法中添加 @BehaviorTrace 这个注解就可以了,赶紧配置来试试吧……

AOP面向切面编程在Android开发中的应用相关推荐

  1. 【AOP 面向切面编程】Android Studio 中配置 AspectJ ( 下载并配置AS中 jar 包 | 配置 Gradle 和 Gradle 插件版本 | 配置 Gradle 构建脚本 )

    文章目录 一.AspectJ 下载 二.拷贝 aspectjrt.jar 到 Android Studio 三.配置 Gradle 和 Gradle 插件版本 四.配置 Gradle 构建脚本 一.A ...

  2. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行原理分析

    文章目录 一.查看使用 AspectJ 后生成的 Class 字节码类 二.AspectJ 的本质 一.查看使用 AspectJ 后生成的 Class 字节码类 在 Android Studio 中查 ...

  3. AOP面向切面编程在Android中的使用

    GitHub地址(欢迎下载完整Demo) https://github.com/ganchuanpu/AOPDemo 项目需求描述 我想类似于这样的个人中心的界面,大家都不会陌生吧.那几个有箭头的地方 ...

  4. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )

    文章目录 一.定义 Join Point 连接点注解 二.定义 Aspect 切面 1.定义 Aspect 切面 2.定义 Aspect 切面 3.逐个处理切入点的各个连接点 4.完整 Aspect ...

  5. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  6. AOP面向切面编程之全局日志打印/统计接口耗时

    目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...

  7. python aop编程_学习笔记: AOP面向切面编程和C#多种实现

    AOP:面向切面编程   编程思想 OOP:一切皆对象,对象交互组成功能,功能叠加组成模块,模块叠加组成系统 类--砖头     系统--房子 类--细胞     系统--人 面向对象是非常适合做大型 ...

  8. 【AOP 面向切面编程】AOP 简介 ( AspectJ 简介 | AspectJ 下载 )

    文章目录 一.AOP 简介 二.AspectJ 简介 三.AspectJ 下载 一.AOP 简介 AOP 是 Aspect Oriented Programming 的缩写 , 面向切面编程 ; 利用 ...

  9. Spring aop面向切面编程概述

    aop概述 1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统一维护的一种技术.使代码耦合性降低,提高 ...

最新文章

  1. AI 渗透应用程序开发的七种趋势及方法
  2. access violation reading 0x0000000000000020
  3. Jasperreport之与Springboot整合
  4. l298n电机哪一端为正_L298N控制直流电机正反转_张天鹏
  5. C++ kadane算法的实现之二(附完整源码)
  6. 腾讯(求丢失的元素)
  7. Sqli-labs less 45
  8. efficientnet-yolo3-tf2的实现
  9. 如何追求高质量的代码?
  10. atomic_fetch_add
  11. JS技能点--日期时间格式化
  12. 专业办公套件(Office 2019)for Mac
  13. 数据库 | Mysql - [索引]
  14. 合合信息——用智能文字识别技术赋能古彝文原籍数字化
  15. linux sli 提高效率,两大优点!NVIDIA混合SLI功能完全解析
  16. 【Allen方差】计算allen方差
  17. 实时时钟模块RX-8010SJ
  18. 【SVG素材网站】免费icon、logo素材下载
  19. linux网口初始化_深入理解Linux网络技术内幕——网络设备初始化
  20. 软件工程论文书写设计步骤及如何降低重复率

热门文章

  1. 网络安全漏洞复现与分析
  2. python微信定时发消息_Python开发企业微信机器人每天定时发消息实例
  3. 奢侈的人生是节约自己
  4. python调用cmd合并大量ts文件失败_python之爬虫(爬取.ts文件并将其合并为.MP4文件——以及一些异常的注意事项)...
  5. 新手站长如何快速查看心仪的网站使用的什么模板和插件?
  6. clover正常的安装完成后,进入系统会出现死循环,AMFI:Denying core dump for pid *** too many corpses being created
  7. Code128一维码(解码)
  8. 网络安全菜鸟学习之漏洞篇——XSS(一)
  9. php setcookie 清除,php-setcookie不删除cookie
  10. 【操作系统笔记(三)】操作系统的历史