wurensen / gradle_plugin_android_aspectjx

A Android gradle plugin that effects AspectJ on Android project and can hook methods in Kotlin, aar and jar file.
Apache License 2.0
363 stars 50 forks source link

[Error]org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesWithAjxForDebug'. #42

Closed androidKy closed 2 years ago

androidKy commented 2 years ago

构建环境相关信息:

编译构建报错失败,看报错信息没什么头绪,麻烦大神帮忙看看。

Task :app:transformClassesWithAjxForDebug ajx[debug] transform start... [ajx] close all open jar files: count=0,cost=0ms ajx[debug] incremental=false

Task :app:transformClassesWithAjxForDebug FAILED

Execution failed for task ':app:transformClassesWithAjxForDebug'.

java.util.concurrent.ExecutionException: org.gradle.api.GradleException: ABORT

androidKy commented 2 years ago

作者给的demo是可以跑起来的,但照着demo把插件移到我的项目就不行了,因为我的项目的第三方jar和aar和远程依赖库有点多,感觉是哪个库引起的问题,然后也配置了exclude '.jar'和exclude '.aar',还是会报错

wurensen commented 2 years ago

@androidKy 你可以先升级到最新版本,仍然出错的话,就exclude掉这个的来源:

Caused by: org.aspectj.weaver.BCException: Whilst processing type 'Lleakcanary/internal/activity/screen/HeapAnalysisFailureScreen$createView$1$1$1;' - cannot cast the outer type to a reference type. Signature=Lleakcanary/internal/activity/screen/HeapAnalysisFailureScreen$createView$1$1; toString()=leakcanary.internal.activity.screen.HeapAnalysisFailureScreen$createView$1$1 class=HeapAnalysisFailureScreen$createView$1$1
androidKy commented 2 years ago

@androidKy 你可以先升级到最新版本,仍然出错的话,就exclude掉这个的来源:

Caused by: org.aspectj.weaver.BCException: Whilst processing type 'Lleakcanary/internal/activity/screen/HeapAnalysisFailureScreen$createView$1$1$1;' - cannot cast the outer type to a reference type. Signature=Lleakcanary/internal/activity/screen/HeapAnalysisFailureScreen$createView$1$1; toString()=leakcanary.internal.activity.screen.HeapAnalysisFailureScreen$createView$1$1 class=HeapAnalysisFailureScreen$createView$1$1

现在已经是最新版本3.2.0了,想问下可以这样去掉去掉jar和aar包的来源的吗?exclude ".jar", ".aar",我测了一下好像不生效的,只能通过类的路径exclude

androidKy commented 2 years ago

而且最神奇的是我把这些lib和aar复制到demo去,又没报这个错,gradle版本都一致

wurensen commented 2 years ago

看你上面的错误堆栈,明显不是最新版本,你如果是从旧版本插件升级到3.2.0,可以先clean一下工程。

androidKy commented 2 years ago

嗯,升级到3.2.0了并且exclude掉报错的那些lib,但不知道为啥会报duplicate_classes的错误.

Task :app:mergeProjectDexDebug FAILED AGPBI: {"kind":"error","text":"Type com.google.gson.annotations.Expose is defined multiple times: /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/8361f51ef64e50176085885c495666b0ceaca41a425690f59725ad034931c8cc_0.jar:classes.dex, /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/a3af66a5125eeca3f668f48c73e59b1d680df1653b5306fceb4fafd8f0f51799_0.jar:classes.dex","sources":[{"file":"/Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/8361f51ef64e50176085885c495666b0ceaca41a425690f59725ad034931c8cc_0.jar"}],"tool":"D8"} com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: Learn how to resolve the issue at https://developer.android.com/studio/build/dependencies#duplicate_classes. Type com.google.gson.annotations.Expose is defined multiple times: /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/8361f51ef64e50176085885c495666b0ceaca41a425690f59725ad034931c8cc_0.jar:classes.dex, /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/a3af66a5125eeca3f668f48c73e59b1d680df1653b5306fceb4fafd8f0f51799_0.jar:classes.dex at com.android.builder.dexing.D8DexArchiveMerger.getExceptionToRethrow(D8DexArchiveMerger.java:151) at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:138) at com.android.build.gradle.internal.tasks.DexMergingWorkAction.merge(DexMergingTask.kt:859) at com.android.build.gradle.internal.tasks.DexMergingWorkAction.run(DexMergingTask.kt:805) at com.android.build.gradle.internal.profile.ProfileAwareWorkAction.execute(ProfileAwareWorkAction.kt:74) at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:63) at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:66) at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:62) at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:97) at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:62) at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44) at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41) at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:59) at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$2(DefaultWorkerExecutor.java:205) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:187) at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:120) at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:162) at org.gradle.internal.Factories$1.create(Factories.java:31) at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:270) at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:119) at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:124) at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:157) at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:126) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at java.base/java.lang.Thread.run(Thread.java:829) Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/8361f51ef64e50176085885c495666b0ceaca41a425690f59725ad034931c8cc_0.jar:classes.dex at Version.fakeStackEntry(Version_3.2.74.java:0) at com.android.tools.r8.internal.ci.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:68) at com.android.tools.r8.internal.ci.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:28) at com.android.tools.r8.internal.ci.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:27) at com.android.tools.r8.internal.ci.b(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:3) at com.android.tools.r8.D8.run(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:11) at com.android.builder.dexing.D8DexArchiveMerger.mergeDexArchives(D8DexArchiveMerger.java:136) ... 38 more Caused by: com.android.tools.r8.internal.a: Type com.google.gson.annotations.Expose is defined multiple times: /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/8361f51ef64e50176085885c495666b0ceaca41a425690f59725ad034931c8cc_0.jar:classes.dex, /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/a3af66a5125eeca3f668f48c73e59b1d680df1653b5306fceb4fafd8f0f51799_0.jar:classes.dex at com.android.tools.r8.internal.vQ.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:14) at com.android.tools.r8.internal.vQ.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:22) at com.android.tools.r8.internal.zK.b(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:7) at com.android.tools.r8.internal.zK.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:23) at com.android.tools.r8.internal.zK.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:10) at java.base/java.util.concurrent.ConcurrentHashMap.merge(ConcurrentHashMap.java:2048) at com.android.tools.r8.internal.zK.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:6) at com.android.tools.r8.graph.A2$a.e(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:4) at com.android.tools.r8.dex.b.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:110) at com.android.tools.r8.dex.b.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:28) at com.android.tools.r8.D8.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:26) at com.android.tools.r8.D8.d(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:593) at com.android.tools.r8.D8.b(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:1) at com.android.tools.r8.internal.ci.a(R8_3.2.74_8761c622ca9e0f3de56216afa3dc074e1654beeea6424834491619aec2c0fe43:24) ... 41 more

Caused by: com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: /Users/quinx/Desktop/workspace_topon/project/up_sdk_android/anythink_china_project/app/build/intermediates/mixed_scope_dex_archive/debug/out/8361f51ef64e50176085885c495666b0ceaca41a425690f59725ad034931c8cc_0.jar:classes.dex

wurensen commented 2 years ago

com.google.gson.annotations.Expose 重复了,你排查下

androidKy commented 2 years ago

但我去掉插件运行就不会报这个合并资源的错误

androidKy commented 2 years ago

感觉应该是这个Aspect插件不会跟原生的gradle的插件一样会自动合并相同的jar

wurensen commented 2 years ago

这个插件就是自定义AGP提供的transform进行字节码文件处理,因为Aspectj的特性,如果发生织入是会多出class文件的。 至于合并相同的jar?你如果是指的重复依赖,那依赖那边会去处理,跟插件没关系。但如果你确实通过maven引入的依赖,又本地引入或者写了相同类,那确实会出现重复类问题,这本身就是不允许的。 如果是引入这个插件出现重复类,可以根据module/build/tmp/transformClassesWithAjxForXXX/buildConfigCache.json文件,查找weaveOutputs相关信息,有对应的输入和输出。

androidKy commented 2 years ago
image

应该是这个gson.jar重复了,但项目需求是要同时存在两个相同的jar的,然后也通过exclude ‘com.google'避免对gson这个lib进行代码织入,但还是会报duplicate_classes的错误.

wurensen commented 2 years ago

@androidKy 你可以先升级到最新版本,仍然出错的话,就exclude掉这个的来源:

Caused by: org.aspectj.weaver.BCException: Whilst processing type 'Lleakcanary/internal/activity/screen/HeapAnalysisFailureScreen$createView$1$1$1;' - cannot cast the outer type to a reference type. Signature=Lleakcanary/internal/activity/screen/HeapAnalysisFailureScreen$createView$1$1; toString()=leakcanary.internal.activity.screen.HeapAnalysisFailureScreen$createView$1$1 class=HeapAnalysisFailureScreen$createView$1$1

现在已经是最新版本3.2.0了,想问下可以这样去掉去掉jar和aar包的来源的吗?exclude ".jar", ".aar",我测了一下好像不生效的,只能通过类的路径exclude

不可以用exclude jar或者aar的方式来过滤,只能通过类的路径

wurensen commented 2 years ago
image

应该是这个gson.jar重复了,但项目需求是要同时存在两个相同的jar的,然后也通过exclude ‘com.google'避免对gson这个lib进行代码织入,但还是会报duplicate_classes的错误.

你确定不引入这个插件不会报重复吗?你这边两个目录是针对不同的flavor吗?

androidKy commented 2 years ago
image

应该是这个gson.jar重复了,但项目需求是要同时存在两个相同的jar的,然后也通过exclude ‘com.google'避免对gson这个lib进行代码织入,但还是会报duplicate_classes的错误.

你确定不引入这个插件不会报重复吗?你这边两个目录是针对不同的flavor吗?

确定不引入这个插件不会报重复,这两个目录是针对相同的flavor

wurensen commented 2 years ago

你引入插件,但是禁用试试:

aspectjx {
    enabled = false
}
androidKy commented 2 years ago

你引入插件,但是禁用试试:

aspectjx {
    enabled = false
}

还是会报duplicate_classes异常,但如果没引入apply plugin: 'io.github.wurensen.android-aspectjx',运行是可以正常安装的,我刚试了一下新建了一个demo,然后也引入相同的jar在不同的目录,又可以直接安装,有点懵了,不知道项目哪里影响到了,检查了gradle环境和aspect环境又是一样的

wurensen commented 2 years ago

那应该就不是织入导致的了,因为禁用后,所有输入文件会直接拷贝到输出中。你看看有没有办法创建一个可以复现的demo。

androidKy commented 2 years ago

嗯,也只能这样排查了,感谢大佬的耐心解答🙏

androidKy commented 2 years ago

大佬,那个资源冲突的问题解决了,因为我项目这边是用compileOnly方式引入了两个相同的jar,但实际运行的时候只会implemention其中一个,所以你没插件时是不会报错的,但引入插件后,因为没有exclude这两个jar,所以是会对两个jar进行输出就会导致冲突了

androidKy commented 2 years ago

然后还有最后一个问题,就是我可以在a library对b library的类进行织入吗,我发现好像只能在对应的module写对应的Aspect类进行织入。。。

wurensen commented 2 years ago

大佬,那个资源冲突的问题解决了,因为我项目这边是用compileOnly方式引入了两个相同的jar,但实际运行的时候只会implemention其中一个,所以你没插件时是不会报错的,但引入插件后,因为没有exclude这两个jar,所以是会对两个jar进行输出就会导致冲突了

compileOnly会参与编译,但是不会被当成transform的输入输出的。

wurensen commented 2 years ago

然后还有最后一个问题,就是我可以在a library对b library的类进行织入吗,我发现好像只能在对应的module写对应的Aspect类进行织入。。。

androidKy commented 2 years ago

然后还有最后一个问题,就是我可以在a library对b library的类进行织入吗,我发现好像只能在对应的module写对应的Aspect类进行织入。。。

  • a library无法对b library进行织入(因为library在进行transform处理时,对于其它library仅仅是依赖的关系,输出的library对应的产物是不会包含其它library的类的)
  • 但是app module可以收集到所有依赖的织入规则类,并进行织入处理(因为app最终会把所有实际依赖的类打包进行输出);换句话说,如果你的library中有定义织入类,是会对app module产生影响的。当然,前提都是app module也使用了该插件。

明白了,感谢大佬的解答🙏