參考了:http://www.lxweimin.com/p/4cf5cb9e4b99
項目gradle
在plugins上面添加buildscript 如下:
buildscript {
dependencies {
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
}
}
plugins {
id 'com.android.application' version '7.1.3' apply false
id 'com.android.library' version '7.1.3' apply false
id 'org.jetbrains.kotlin.android' version '1.7.0' apply false
}
task clean(type: Delete) {
delete rootProject.buildDir
}
這里application和library的版本要改成7.1.3,我一開始用7.2.1會報下面的錯。估計是兼容性問題
A problem occurred evaluating project ':app'.
> Failed to apply plugin 'android-aspectjx'.
> No such property: FD_INTERMEDIATES for class: com.android.builder.model.AndroidProject
app.bulid.gradle的plugins同級下面添加apply plugin: 'android-aspectjx'
plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
}
apply plugin: 'android-aspectjx'
添加依賴
implementation 'org.aspectj:aspectjrt:1.9.5'
添加不掃描的包 跟android同級
aspectjx {
// 排除一些第三方庫的包名(Gson、 LeakCanary 和 AOP 有沖突)
// 否則就會起沖突:ClassNotFoundException: Didn't find class on path: DexPathList
exclude 'androidx', 'com.google', 'com.squareup', 'com.alipay', 'com.taobao',
'org.apache',
'org.jetbrains.kotlin',
"module-info", 'versions.9'
}
特別要排除 'versions.9',不然kotlin編譯時報錯 報錯 zip file is empty,
zip file is empty · Issue #286 · HujiangTechnology/gradle_plugin_android_aspectjx · GitHub
測試代碼
@Aspect
class MethodAspect {
// 此處指定一個切點,后面括號中的是切點表達式(個人理解:其表達的就是一個join point),詳細見Aspect基本語法
@Pointcut("call(* com.test.myapplication.MainActivity.haha(..))")
private fun callMethod() {
}
//表示一個通知,類型為Before并指定切點為上面callMethod方法所表示的那個切點
@Before("callMethod()")
fun beforeMethodCall(joinPoint: JoinPoint) {
Log.e("haha", "before->" + joinPoint.target.toString()) //織入的代碼
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
findViewById<TextView>(R.id.text).setOnClickListener {
haha()
}
}
fun haha() {
Log.d("haha", "haha")
}
}
打印
before->com.test.myapplication.MainActivity@4b5a4b
haha