Android中使用AOP进行拦截统一处理功能(如网络判断)

首先我项目的结构如下:

我的项目依赖的顺序为buildSrc--->lib_common-->lib_flight_sdk-->lib_uav-->app

 其中buildSrc中主要是对依赖的声明;

lib_common中是在dependency中添加依赖

步骤:

1.首先在buildSrc中声明依赖:

    const val aspect_version="1.9.6"
   //切面编程
    const val aspect="org.aspectj:aspectjrt:${V.aspect_version}"

2.在lib_common的build.gradle中添加依赖:

//切面编程
    implementation Deps.aspect

注意:不要在这个build.gradle中plugin中添加插件:android-aspectjx

plugins {
    id 'com.android.application'
    id "kotlin-android"
    id 'kotlin-kapt'
    id 'kotlin-android-extensions'
    id 'android-aspectjx'
}

3.在lib_uav的build.gradle中添加依赖:

dependencies {
 implementation Deps.aspect
}

4.在根目录的build.gradle中增加适配kotlin的插件gradle-android-plugin-aspectjx,并需要在repositories中增加jcenter:

repositories {
        google()
        mavenCentral()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.1'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
    }

5.gradle-wrapper.properties中设置:

//需要与gradle插件一致
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9-rc-1-bin.zip

6.根目录gradle.properties中增加:

android.enableBuildCache=false

7.根目录的setting.gradle中需要更改:

将
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
更改为:
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

不然会报project的repository跟根目录的repository的冲突

8.在app的build.gradle中添加插件:android-aspectjx

//这里因为要使用kotlin,所以将插件添加在kotlin插件的下面
plugins {
    id 'com.android.application'
    id "kotlin-android"
    id 'kotlin-kapt'
    id 'kotlin-android-extensions'
    id 'android-aspectjx'
}

//在android{}同层的目录下增加:
android{}
Aspectjx{
  include 'XX' //这里最好是只包含你自己要用到注解和切面代码的包名,防止引起第三方依赖问题
}

dependencies{

implementation Deps.aspect

}

9.编写自定义注解和切片拦截,并添加注解在对应需要拦截的方法上

//1.注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
 annotation class VerifySN {
}

//2.切片实现类
open class VerifySnAspect {
    
    /**
     * 找到处理的切点
     * * *(..)  可以处理所有的方法
     */
    @Pointcut("execution(@com.loyo.lib_uav.aspect.VerifySN * *(..))")
    private fun verifySnBehavior(){}
    /**
     * 处理切面
     */
    @Around("verifySnBehavior()")
    @Throws(Throwable::class)
   open fun verifySn(joinPoint: ProceedingJoinPoint){
   //TODO 实现拦截功能
}
}

//3.在对应方法上增加注解
   @VerifySN
   open fun clickStartBtn(){

   }

遇到的坑:

问题一:java.lang.NoSuchMethodError: No static method aspectOf()
解决方法:将插件android-aspectjx和aspectjx {}只能在app的build.gradle中,其他module中不能设置

问题二:zip file is empty
解决方法:按照上述的解决方法可以解决这个问题

问题三:设置的注解,但是没有进入切面拦截功能
解决方法:严格按照我上述的步骤,可以完美解决

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值