首先使用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很簡單,像上面那樣,就很容易的實現了方法的增強處理,而且侵入性很低,使用簡單。