安卓中使用AspectJ
原创
©著作权归作者所有:来自51CTO博客作者抱琴司棋侍书入画的原创作品,请联系作者获取转载授权,否则将追究法律责任
参考沪江的开源框架->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'
}
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
*/