Android AOP编程
用于权限处理,日志,埋点,单击处理、网络检测等等场景。
Aspectj将代码生成字节码插入到需要的地方
Project的build.gradle配置
// AOP 配置插件:https://github.com/HujiangTechnology/gradle_plugin_android_aspectjxclasspath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
依赖引入
// AOP 插件库:https://mvnrepository.com/artifact/org.aspectj/aspectjrtapi 'org.aspectj:aspectjrt:1.9.5'
app.gradle配置
apply plugin: 'android-aspectjx'// AOP 配置aspectjx {// 排除一些第三方库的包名(Gson、 LeakCanary 和 AOP 有冲突)// 否则就会起冲突:ClassNotFoundException: Didn't find class on path: DexPathListexclude 'androidx', 'com.google', 'com.squareup', 'com.alipay', 'com.taobao', 'org.apache','org.jetbrains.kotlin',"module-info", 'versions.9'}
切面类
被@Aspect注解修饰的类,实现代码添加的地方
- 定义入口
/*** 方法切入点*/@注解 单击 返回值类型 类名.函数名(参数)@Pointcut("execution(@com.yhj.lib_base.aop.SingleClick * *(..))")public void method() {}/*** 定义入口* @注解 访问权限 返回值类型 类名.函数名(参数)* ..表示参数不限定* 注解方法传值,通过*/@Pointcut("execution(@com.yhj.module_home.aspectj.annotation.PermissionNeed * * (..)) && @annotation(permissionNeed) ")public void requestPermission(PermissionNeed permissionNeed){}
/*** 变量必须一样* @Around 下面两种写法相同,规范是第一种* @Around 表示替换方法代码,但是如果想要执行可以通过 joinPoint.proceed();* 不支持和After()、Before()一起使用*/// @After()// @Before()@Around("requestPermission(permissionNeed)")// @Around("execution(@com.yhj.module_home.aspectj.annotation.PermissionNeed * * (..)) && @annotation(permissionNeed) ")public void aroundJoinPoint( ProceedingJoinPoint joinPoint,PermissionNeed permissionNeed){//实现功能Object obj = joinPoint.getThis();Context context= (Context) obj;}
