关于引入Aspectjx插件,写AOP时引发的问题,zip file is empty

关于引入Aspectjx插件,写AOP时引发的问题,zip file is empty

摘要

原先项目使用的是XAOP的来使用@SingleClick来实现防抖功能,后续因项目由原来的Java全量替换为Kotlin,导致防抖注解失效,就自行使用Aspectjx写了个@SingleClick,具体写法网上很多,自行百度,引入后就开始编译通不过,报错内容

Caused by: java.util.zip.ZipException: zip file is empty
		at java.util.zip.ZipFile.open(Native Method)
		at java.util.zip.ZipFile.(ZipFile.java:225)
		at java.util.zip.ZipFile.(ZipFile.java:279)
		at com.android.tools.r8.ArchiveClassFileProvider.(:24)
		at com.android.tools.r8.ArchiveClassFileProvider.(:1)
		at com.android.builder.dexing.r8.CachingArchiveClassFileProvider.(CachingArchiveClassFileProvider.java:32)
		at com.android.builder.dexing.r8.ClassFileProviderFactory.createProvider(ClassFileProviderFactory.java:123)
		at com.android.builder.dexing.r8.ClassFileProviderFactory.(ClassFileProviderFactory.java:93)
		at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.transform(DexArchiveBuilderTransform.java:369)
		... 99 more

相关代码

讲一下大致引入吧,直接上代码(摘自官网)
首先需要引入Aspectjx插件:Aspectjx官网
写文章时的最新版本为:
Aspectjx最新版本

  • 在项目级别build.gradle文件中添加
buildscript {
	...
	dependencies {
		...
        classpath 'com.hujiang.aspectjx:gradle-android-plugin-aspectjx:2.0.10'
    }
}
  • 在app项目的build.gradle里应用插件
//我使用的是这个
apply plugin: 'android-aspectjx'
//或者这样也可以
apply plugin: 'com.hujiang.android-aspectjx'
  • 当然也需要引入依赖

dependencies {
	...
    //aspectj
    api 'org.aspectj:aspectjrt:1.9.6'
}

如果Module也用到了也需要在对应的Module的build.gradle引入,推荐每个都加上吧
至此,引入完毕
开始
编译。。。
Boom。。。
再次奉上错误代码:

Caused by: java.util.zip.ZipException: zip file is empty
		at java.util.zip.ZipFile.open(Native Method)
		at java.util.zip.ZipFile.(ZipFile.java:225)
		at java.util.zip.ZipFile.(ZipFile.java:279)
		at com.android.tools.r8.ArchiveClassFileProvider.(:24)
		at com.android.tools.r8.ArchiveClassFileProvider.(:1)
		at com.android.builder.dexing.r8.CachingArchiveClassFileProvider.(CachingArchiveClassFileProvider.java:32)
		at com.android.builder.dexing.r8.ClassFileProviderFactory.createProvider(ClassFileProviderFactory.java:123)
		at com.android.builder.dexing.r8.ClassFileProviderFactory.(ClassFileProviderFactory.java:93)
		at com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform.transform(DexArchiveBuilderTransform.java:369)
		... 99 more

不演了,摊牌了,没有那么多花里胡哨的东西,直接说解决方案,网上有各种说什么这个包排除,那个包排除,基本上的问题都来着以下几点。

  • 附上源码重点的:
/**
 * 实现防止按钮连续点击
 * @author Create by ChawLoo on 2021/3/4 0004 11:01
 *----------Dragon be here!----------/
 *       ┌─┐      ┌─┐
 *     ┌─┘─┴──────┘─┴─┐
 *     │              │
 *     │      ─       │
 *     │  ┬─┘   └─┬   │
 *     │              │
 *     │      ┴       │
 *     │              │
 *     └───┐      ┌───┘
 *         │      │神兽保佑
 *         │      │代码无BUG!
 *         │      └──────┐
 *         │             ├┐
 *         │             ┌┘
 *         └┐ ┐ ┌───┬─┐ ┌┘
 *          │ ┤ ┤   │ ┤ ┤
 *          └─┴─┘   └─┴─┘
 *─────────────神兽出没───────────────/
 */

@Aspect
open class SingleClickAspect {
   ...
    /**
     * 定义切点,标记切点为所有被@SingleClick注解的方法
     */
    @Pointcut("execution(@net.cbi360.jst.base.utils.onclick.SingleClick * *(..))")
    fun methodAnnotated() {
    }

    /**
     * 定义一个切面方法,包裹切点方法
     */
    @Around("methodAnnotated()")
    @Throws(Throwable::class)
    fun aroundJoinPoint(joinPoint: ProceedingJoinPoint) {
        ...
    }
}

重点在于methodAnnotated需要用private修饰 和aroundJoinPoint需要open 开放出来,具体修改为:

@Aspect
open class SingleClickAspect {
   ...
    /**
     * 定义切点,标记切点为所有被@SingleClick注解的方法
     */
    @Pointcut("execution(@net.cbi360.jst.base.utils.onclick.SingleClick * *(..))")
    private fun methodAnnotated() {
    }

    /**
     * 定义一个切面方法,包裹切点方法
     */
    @Around("methodAnnotated()")
    @Throws(Throwable::class)
    open fun aroundJoinPoint(joinPoint: ProceedingJoinPoint) {
        ...
    }
}

编译后就没有出现那个错误,但是需要把冲突的依赖包去除在外:
排除代码如下(官网也有):

//这是官网样例
aspectjx {
//排除所有package路径中包含`android.support`的class文件及库(jar文件)
	exclude 'android.support'
}

本人引有各种第三方,如友盟等,大致可以为如下代码

//这是官网样例
aspectjx {
    exclude 'versions.9'
    exclude 'com.squareup'
    exclude 'leakcanary'
    exclude 'com.taobao'
    exclude 'com.ut'
}

具体还是需要看自己项目的情况,遇到冲突的就把包名放进去。
至此,问题就解决了,如果遇到其他问题,后面在补充吧

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页