Android 使用AspectJ踩坑记录

文章介绍了如何在Android项目中使用AspectJ进行登录拦截操作,包括配置gradle插件,处理编译错误,以及提供了一个登录拦截的AOP示例。在实现过程中遇到了如‘Failedtoapplyplugin’和‘zipfileisempty’等错误,并给出了相应的解决方案,最后展示了@CheckLogin注解和AuthorizeAspect切面类的代码示例。

引言

项目中为了更好的校验需登录的按钮操作,未登录就直接跳转到登录页面。

配置

单app项目
  1. 根目录build.gradle中添加 classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'

  1. 对应app模块build.gradle 添加:

apply plugin: 'android-aspectjx'
implementation 'org.aspectj:aspectjrt:1.8.9'
多模块项目配置:
  1. 根目录build.gradle中添加 classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'

  1. 对应app模块build.gradle 添加:apply plugin: 'android-aspectjx'

  1. Common模块build.gradle 添加:

apply plugin: 'android-aspectjx'
api 'org.aspectj:aspectjrt:1.8.9'
编译报错的问题
> Failed to apply plugin 'android-aspectjx'.
   > Build was configured to prefer settings repositories over project repositories but repository 'MavenLocal' was added by plugin 'android-aspectjx'

解决方案:替换setting.gradle文件dependencyResolutionManagement配置中repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)为repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

Cause: zip file is empty

解决方案:对应app模块android{}中添加配置

aspectjx {
        // 排除一些第三方库的包名(和 AOP 有冲突)
        exclude 'androidx', 'com.google',
                'org.apache',
                'org.jetbrains.kotlin',
                "module-info", 'versions.9','kotlinx'
    }
  1. 插件版本不兼容

最初项目插件版本为

plugins {
    id 'com.android.application' version '7.2.0' apply false
    id 'com.android.library' version '7.2.0' apply false
}

解决方案:将插件版本改为如下

plugins {
    id 'com.android.application' version '7.1.3' apply false
    id 'com.android.library' version '7.1.3' apply false
}

登录拦截栗子

注解类CheckLogin

@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
annotation class CheckLogin()

AOP拦截类

@Aspect
class AuthorizeAspect {
    //处理被注解@CheckLogin标记的所有方法
    @Pointcut("execution(@com.xxx.common.aspectj.CheckLogin * *(..))")
    fun pointCheckLogin(){}

    @Around("pointCheckLogin()")
    fun aroundCheckLogin(joinPoint: ProceedingJoinPoint){
        val method = (joinPoint.signature as MethodSignature).method
        if (method.isAnnotationPresent(CheckLogin::class.java) && isLogin != true) {
            //未登录,跳转到登录页面
            jumpLoginPage()
        } else {
            joinPoint.proceed()
        }
    }
}

测试

/**
 *跳转收藏页面方法执行时,需校验登录,未登录就直接跳转到登录页面
 */
@CheckLogin
fun jumpCollectPage() {}
小结

仅记录在使用AspectJ中遇到的一些问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值