前言

首先,Aspectj目前在Android中的使用已经非常广泛了,比如说很多第三方统计的SDK都是利用它来做切点进行统计的,楼主还是在今年才开始接触它,感觉到它的强大之后就无法自拔了,经过多次试验之后来记录下它的使用方式。

名词解释

1.AOP

AOP是Aspect Oriented Programming的缩写,也就是面相切面编程。它通过预编译或者运行期动态代理实现程序功能的统一维护。它是函数式编程的一种衍生泛型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑之间的耦合度降低,提高程序的可重用性。

2.AspectJ

AspectJ 是使用最为广泛的 AOP 实现方案,适用于 Java 平台,官网地址:http://www.eclipse.org/aspectj/ 。AspectJ 是在静态织入代码,即在编译期注入代码的。

AspectJ在Android中的使用

一、插件化使用

查看地址:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
根据说明来进行配置:
1、在根目录的build.gradle中配置

dependencies {        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.8'        }

2、然后再在app项目的build.gradle里应用插件

apply plugin: 'android-aspectjx'//或者这样也可以apply plugin: 'com.hujiang.android-aspectjx'

3、然后还需要根据自己项目的特点有一些配置aspectjx 的一些东西。
根据说明来看的话配置以上几点就可以了,但我这样操作之后一直都没有解决问题,会报一个 "zip file is empty"的错误,查了issues后还是没有解决问题,所以这边我主要讲第二个。

二、直接使用aspectJ

1.在根目录的build.gradle中配置

dependencies {        classpath 'org.aspectj:aspectjtools:1.9.4'        }

2.在app项目的build.gradle中添加

dependencies {        implementation 'org.aspectj:aspectjrt:1.9.4'        }

并且在build.gradle文件最后添加一下代码

import org.aspectj.bridge.IMessageimport org.aspectj.bridge.MessageHandlerimport org.aspectj.tools.ajc.Mainfinal def log = project.logger//在构建工程时,执行编辑android.libraryVariants.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.9",                         "-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;            }        }    }}

3.添加切片代码即可,注意@Pointcut的使用。ps:这里主讲配置,不讲代码

注意

最后讲下标题的内容,当AspectJ在libray中使用时,需要注意你的切片代码注解是在哪个module下的话,就需要在哪个module的buidl.gradle中添加第二点说的配置。

最后,如果有任何问题可以评论或者联系我,谢谢!Demo地址:https://download.csdn.net/download/ling9400/12060639

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 万字长文带你了解最常用的开源 Squid 代理服务器
  3. Android中与ViewRoot相关的一些概念
  4. Android(安卓)为点击事件添加震动效果
  5. Android(安卓)M 动态权限获取
  6. Flutter混合开发踩坑指北
  7. android AIDL RPC 机制
  8. Android(安卓)中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksm
  9. Lan给您分享的岗位信息(Android)

随机推荐

  1. linux抢占式调度
  2. Linux中有趣的几条命令
  3. Linux 基础总结(一)--Linux常用系统变量,a
  4. 英特尔 QSV 在 FFMPEG 中的使用(Linux)
  5. 在虚拟机中的Linux系统搭建ftp服务器,使用
  6. 如何使用tc和cgroup来预防数据包
  7. 无法在ubuntu10.04上编译岩浆1.3,CUDA 5.
  8. 如何转换python中可执行的python脚本?
  9. linux软RAID的创建和维护
  10. linux 下安装web开发环境