AAR Jacoco Dependency and Gradle

时间:2017-09-29 17:47:04

标签: java android gradle android-gradle jacoco

我们目前提供Android AAR sdk,我们要求用户导入并添加为编译时依赖项。

我们最近成立了SonaQube和Jacoco;所以AAR本身使用Jacoco Plugin来测试代码覆盖率。

我们有几个使用AAR的演示应用程序以确保兼容性。

问题

我们现在面临的问题是这个错误Here,即:

java.lang.ClassNotFoundException: Didn't find class "org.jacoco.agent.rt.internal_14f7ee5.Offline" 

java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_14f7ee5/Offline;

当AAR的消费应用程序启动时,问题就出现在运行时。

解决方法

我已经设置了上述错误中提供的解决方法,即强制所有APP项目的APP构建脚本使用相同的jacoco版本,并且还包括jacoco组(代理,ant,核心和报告)作为编译时间依赖性。

// App build.gradle
dependencies {
  compile(project(path: ':TheAARInQuestion')) {
    transitive false
  }
  ....
  compile "org.jacoco:org.jacoco.agent:$jacoco_version"
  compile "org.jacoco:org.jacoco.ant:$jacoco_version"
  compile "org.jacoco:org.jacoco.core:$jacoco_version"
  compile "org.jacoco:org.jacoco.report:$jacoco_version"

}
// Top level build.gradle buildscript
buildscript {
  def jacoco_version = '0.7.6.201602180812'
  dependencies {
   ....

    classpath "org.jacoco:org.jacoco.agent:$jacoco_version"
    classpath "org.jacoco:org.jacoco.ant:$jacoco_version"
    classpath "org.jacoco:org.jacoco.core:$jacoco_version"
    classpath "org.jacoco:org.jacoco.report:$jacoco_version"

  }
  allprojects {
    configurations.all {
        resolutionStrategy {
            force "org.jacoco:org.jacoco.agent:$jacoco_version"
            force "org.jacoco:org.jacoco.ant:$jacoco_version"
            force "org.jacoco:org.jacoco.core:$jacoco_version"
            force "org.jacoco:org.jacoco.report:$jacoco_version"
        }
    }
  }
}

我的问题

我只想应用jacoco并在测试阶段使用jacoco库,IE testCompile仅用于AAR构建周期,以便AAR的消费者不需要执行上述设置,因为它可能与他们的APK构建过程。

我怎样才能仅在测试期间需要测试所需的依赖项,而在AAR的实际运行时实现的类路径上不需要它们?

IE我希望提供一个AAR,它不需要客户在类路径上拥有jar,也不需要额外的编译时依赖性。这可能吗?

编辑1

在进一步阅读jacoco之后,似乎jacoco依赖于JavaAgents,而DalAik VM(Android)并不完全支持它。 Jacoco确实有离线模式,但gradle插件不支持开箱即用。虽然here有一个功能请求。

有了这些知识,我有条件地根据属性应用插件和任务,以便在我的build.gradle中运行分析。

0 个答案:

没有答案