我们目前提供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中运行分析。