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


    首先我项目的结构如下:

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

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

    lib_common中是在dependency中添加依赖

    步骤:

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

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

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

    1. //切面编程
    2. implementation Deps.aspect

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

    1. plugins {
    2. id 'com.android.application'
    3. id "kotlin-android"
    4. id 'kotlin-kapt'
    5. id 'kotlin-android-extensions'
    6. id 'android-aspectjx'
    7. }

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

    1. dependencies {
    2. implementation Deps.aspect
    3. }

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

    1. repositories {
    2. google()
    3. mavenCentral()
    4. jcenter()
    5. }
    6. dependencies {
    7. classpath 'com.android.tools.build:gradle:4.2.1'
    8. classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.31'
    9. classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
    10. }

    5.gradle-wrapper.properties中设置:

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

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

    android.enableBuildCache=false

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

    1. repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    2. 更改为:
    3. repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    4. 不然会报project的repository跟根目录的repository的冲突

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

    1. //这里因为要使用kotlin,所以将插件添加在kotlin插件的下面
    2. plugins {
    3. id 'com.android.application'
    4. id "kotlin-android"
    5. id 'kotlin-kapt'
    6. id 'kotlin-android-extensions'
    7. id 'android-aspectjx'
    8. }
    9. //在android{}同层的目录下增加:
    10. android{}
    11. Aspectjx{
    12. include 'XX' //这里最好是只包含你自己要用到注解和切面代码的包名,防止引起第三方依赖问题
    13. }
    14. dependencies{
    15. implementation Deps.aspect
    16. }

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

    1. //1.注解
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Target(ElementType.METHOD)
    4. annotation class VerifySN {
    5. }
    6. //2.切片实现类
    7. open class VerifySnAspect {
    8. /**
    9. * 找到处理的切点
    10. * * *(..) 可以处理所有的方法
    11. */
    12. @Pointcut("execution(@com.loyo.lib_uav.aspect.VerifySN * *(..))")
    13. private fun verifySnBehavior(){}
    14. /**
    15. * 处理切面
    16. */
    17. @Around("verifySnBehavior()")
    18. @Throws(Throwable::class)
    19. open fun verifySn(joinPoint: ProceedingJoinPoint){
    20. //TODO 实现拦截功能
    21. }
    22. }
    23. //3.在对应方法上增加注解
    24. @VerifySN
    25. open fun clickStartBtn(){
    26. }

    遇到的坑:

    1. 问题一:java.lang.NoSuchMethodError: No static method aspectOf()
    2. 解决方法:将插件android-aspectjx和aspectjx {}只能在app的build.gradle中,其他module中不能设置
    3. 问题二:zip file is empty
    4. 解决方法:按照上述的解决方法可以解决这个问题
    5. 问题三:设置的注解,但是没有进入切面拦截功能
    6. 解决方法:严格按照我上述的步骤,可以完美解决

  • 相关阅读:
    训练神经网络解决二分类问题的原理
    android FM DAB相关的知识
    QML之Repeater 控件使用
    2019我的Java面试跳槽经历
    基于springboot实现音乐网站与分享平台项目【项目源码+论文说明】计算机毕业设计
    js分割字符串的方法
    ubuntu18.04设置开机自动启动脚本(以自动启动odoo命令行为例讲解)
    手机也能拍出艺术品?大师镜头,“真”突破了不少
    Spring Boot 之开发注册功能
    第一个Vue程序
  • 原文地址:https://blog.csdn.net/fuzhongbin/article/details/126532554