android - Firebase-perf 与 let 插件冲突

标签 android firebase gradle firebase-performance

我们最近被要求在 Android 应用上实现“Firebase 性能监控”,但它给我们带来了许多不同的问题。该应用程序过去工作得很好,但在添加“firebase-perf”后,它可以编译,但在运行时我们发现 Let plugin 停止工作,使用 @AskPermission 注释定义的每个权限都被忽略。

查看 gradle 构建输出,我偶然发现了这个堆栈跟踪:

java.lang.IllegalStateException: Expecting .,<, or ;, but found firebaseperf while unpacking <K:Ljava/lang/Object;>Lcom/google/android/gms/internal/firebase-perf/zzw<TK;>;
    at org.aspectj.util.GenericSignatureParser.parseClassTypeSignature(GenericSignatureParser.java:204)
    at org.aspectj.util.GenericSignatureParser.parseAsClassSignature(GenericSignatureParser.java:56)
    at org.aspectj.weaver.UnresolvedType.forGenericTypeSignature(UnresolvedType.java:274)
    at org.aspectj.weaver.bcel.BcelWorld.addSourceObjectType(BcelWorld.java:482)
    at org.aspectj.weaver.bcel.BcelWorld.addSourceObjectType(BcelWorld.java:456)
    at org.aspectj.weaver.bcel.BcelWeaver.addAspectsFromJarFile(BcelWeaver.java:263)
    at org.aspectj.weaver.bcel.BcelWeaver.addLibraryJarFile(BcelWeaver.java:236)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.initBcelWorld(AjBuildManager.java:874)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:249)
    at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:185)
    at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112)
    at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60)
    at org.aspectj.tools.ajc.Main.run(Main.java:371)
    at org.aspectj.tools.ajc.Main$run.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133)
    at com.canelmas.let.LetPlugin$_apply_closure2_closure3.doCall(LetPlugin.groovy:66)
    ...

我见过一些类似的案例,但还没有找到解决方案。在我看来,它看起来像是在不同类路径中定义的不同版本的aspectjs之间的冲突。

这是项目级 gradle 文件的相关部分:

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath group: 'org.tmatesoft.svnkit', name: 'svnkit', version: '1.7.11'
        classpath('com.canelmas.let:let-plugin:0.1.11')
        classpath 'com.google.gms:google-services:4.2.0'
        classpath 'com.google.firebase:firebase-plugins:1.1.5'
    }
}

这些是我们在应用程序级 gradle 中定义的 Firebase 依赖项:

dependencies {
    compile 'com.google.firebase:firebase-core:16.0.7'
    compile 'com.google.firebase:firebase-perf:16.2.3'
}

有人知道可能的解决办法吗?

编辑: another thread 中有人声称已经用下面的代码解决了问题,但我不知道如何实际使用它。任何更精通 Gradle 的人都可以解释这个声明应该放在哪里以及我应该用它做什么吗?

我尝试将它放在 gradle 文件的许多不同位置,但收到此错误:“没有这样的属性:类的类路径:org.gradle.api.tasks.compile.JavaCompile”

def filtered_class_filetree = javaCompile.classpath.asFileTree.filter {
    !it.canonicalPath.contains("firebase-perf")
}

最佳答案

如果多个库正在编译不同版本的 aspectj(或任何其他依赖项),您始终可以强制(或忽略)您想要的库,如下所示:

implementation('com.google.firebase:firebase-core:16.0.7', { // this will remove aspectj dependencies from firebase
    exclude group: 'org.aspectj', module: 'aspectjrt'
    exclude group: 'com.android.support', module: 'aspectjtools'
  })

您还可以强制执行方面的版本,如下所示(除了依赖项之外,在模块中):

configurations.all {
    resolutionStrategy.force 'org.aspectj:aspectjrt:x.x.x'
}

回答你的最后一个问题:

I tried placing it many different places of my gradle file but I'm getting this error: "No such property: classpath for class: org.gradle.api.tasks.compile.JavaCompile"

您可以在模块内的 android block 中使用 applicationVariants 访问 java 编译器(和类路径):

  // inside your android module 
  android {
       //...
       applicationVariants.all {
       variant ->
         variant.javaCompiler.classpath = variant.javaCompiler.classpath.filter {
           !it.canonicalPath.contains("firebase-perf")
         }
     }
  }

关于android - Firebase-perf 与 let 插件冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54888254/

相关文章:

java - 寻找一种设计模式来定义进行一组 API 调用并在之后采取行动的各种任务

android - Listview 的页脚 View 未显示在一台设备上,而是显示在另一台设备上?

android - 在 android 中过滤 ListView 时检查了错误的项目

ios - Firebase Messaging - 卸载不会阻止通知

java - 我怎样才能让firebase短链接脱离任务

android - Gradle 构建失败,出现错误 'timeout waiting to connect to the Grade daemon'

java - 调整大小后未调用 LibGDX 渲染

firebase-authentication 登录一次并保持登录状态

java - 导入附加库后 Android Studio gradle 错误 - smack

android - 无法将 Ksoap2 依赖项添加到 Android 项目