首先使用hujiang的AspectJ,地址https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx
,因为它支持kotlin,而官方的不支持kotlin,只支持java,官方地址https://github.com/eclipse/org.aspectj
AspectJ 是面向切向编程(aop)的一个实践,通常用来进行功能增强,或者进行统计跟踪等功能。它的原理是在字节码层级上使用自己独有的一个编译器对字节码文件进行处理,已达到我们需要的目的。
1.贴上git demo地址https://github.com/dongdaniqng/Android-AspectJ-Demo
2.项目结构
app::用来测试aspectj功能,一般是我们的业务module
aspectjlib:用来进行切点定义,切向相关代码逻辑代码编写
3.依赖关系
根目录build.gradle,主要添加classpath:
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
google()
jcenter()
}
dependencies {
...
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.6'
...
}
}
app模块build.gradle,添加插件依赖:
...
apply plugin: 'android-aspectjx'
...
dependencies {
...
implementation project(":aspectjlib")
...
}
aspectjlib模块build.gradle:
dependencies {
...
implementation 'org.aspectj:aspectjrt:1.8.14' \\里面包含需要使用的注解等
...
}
4.详解aspectjlib模块
1.首先,创建一个以@Aspect注解的类,定义切向类,向下面这样:
@Aspect
class AOP_ViewClick {
//业务code
}
2.定义切点,说白了,就是描述你想在代码的哪个位置进行功能增强:
@Before("execution(* android.view.View.OnClickListener.onClick(android.view.View))")
fun log(joinPoint: JoinPoint){
val view = joinPoint.args[0] as View
Log.e("tag",view.contentDescription.toString())
}
execution(* android.view.View.OnClickListener.onClick(android.view.View)) 这行代码就是我们定义的切点,我们要在View的onClick的时候进行某些不可描述的操作。
3.接下来,我们需要定义切点的运行时机,常用的有:
@Before:在方法代码的最前面执行
@After:在方法代码的最后面执行
@Around:可以在方法的前后都执行
4.编写具体的切点逻辑:
@Before("execution(* android.view.View.OnClickListener.onClick(android.view.View))")
fun log(joinPoint: JoinPoint){
val view = joinPoint.args[0] as View
Log.e("tag",view.contentDescription.toString())
}
上面的代码我们打印出了我们切点view的一个属性contentDescription。
5.总结
AspectJ很简单,像上面那样,就很容易的实现了方法的增强处理,而且侵入性很低,使用简单。