关于引入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官网
写文章时的最新版本为:
- 在项目级别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'
}
具体还是需要看自己项目的情况,遇到冲突的就把包名放进去。
至此,问题就解决了,如果遇到其他问题,后面在补充吧