参考沪江的开源框架->https://github.com/HujiangTechnology/gradle_plugin_android_aspectjx

AspectJ是一个代码生成工具
AspectJ语法就是用来定义代码生成规则的语法

简单集成使用示例

  • 添加依赖
//项目的gradle->buildscript->dependencies添加依赖
classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'

//app的gradle->dependencies添加依赖
implementation 'org.aspectj:aspectjrt:1.8.+'
//app的gradle添加plugin
plugins {
id 'android-aspectjx'
}

//解决aspectj java.util.zip.ZipException: zip file is empty问题
//app的gradle->android添加配置项
aspectjx {
enabled true
exclude 'androidx','kotlin','com.google','com.squareup','com.alipay','org.apache'
}
  • aspect类
package cc.catface.aspectj

import android.util.Log
import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before

@Aspect
class AJ {

//将对匹配的方法进行切面处理
@Before("execution(* cc.catface.aspectj.*.*(..))")
fun before(joinPoint: JoinPoint) {
Log.e("AJ!!!", joinPoint.signature.name + "<---")
}
}
  • 被切面处理的类
package cc.catface.aspectj

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log

class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

showSth()
}

fun showSth() {
Log.d("MainActivity", "showSth<---")
}
}
  • 运行后,查看as的logcat打印,可以观察到onCreate()和showSth()方法执行中被切面处理了
2021-08-04 18:03:19.691 26122-26122/cc.catface.aspectj E/AJ!!!: onCreate<---
2021-08-04 18:03:19.734 26122-26122/cc.catface.aspectj E/AJ!!!: showSth<---

统计activity加载布局耗时

@Aspect
class AJInflate {

//使用call指定方法
//setContentView方法没有返回值,所以proceed()执行后不需返回
@Around("call(* androidx.appcompat.app.AppCompatActivity.setContentView(..))")
fun around(point: ProceedingJoinPoint) {
val toShortString = point.signature.toShortString()
val l1 = System.currentTimeMillis()
point.proceed()
val l2 = System.currentTimeMillis()
Log.e("AJ!!!setContentView", "加载布局, 方法:${toShortString}, 耗时ms:${l2 - l1}")
}
}

/*
2021-08-05 10:19:32.720 16188-16188/cc.catface.aspectj E/AJ!!!setContentView: 加载布局, 方法:MainActivity.setContentView(..), 耗时ms:28
*/