安卓中使用AspectJ

参考沪江的开源框架->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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值