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

266 阅读2分钟

首先我项目的结构如下:

我的项目依赖的顺序为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
解决方法:按照上述的解决方法可以解决这个问题

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

本文转自 blog.csdn.net/fuzhongbin/…,如有侵权,请联系删除。