参考沪江的开源框架->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
*/