JTT*_*JTT 5 java android gradle jacoco android-gradle-plugin
我们目前提供了一个 Android AAR sdk,要求用户导入并添加为编译时依赖项。
我们最近成立了 SonaQube 和 Jacoco;因此 AAR 本身使用Jacoco 插件来测试代码覆盖率。
我们有几个使用 AAR 来确保兼容性的演示应用程序。
问题
我们现在面临的问题是这个错误,即:
java.lang.ClassNotFoundException: Didn't find class "org.jacoco.agent.rt.internal_14f7ee5.Offline"
Run Code Online (Sandbox Code Playgroud)
和
java.lang.NoClassDefFoundError: Failed resolution of: Lorg/jacoco/agent/rt/internal_14f7ee5/Offline;
Run Code Online (Sandbox Code Playgroud)
当 AAR 的消费应用程序启动时,该问题会在运行时发生。
解决方法
我已经设置了上述错误中提供的解决方法,即强制所有 APP 项目的 APP 构建脚本使用相同的 jacoco 版本,并且还包含 jacoco 组(agent、ant、core 和 report)作为编译时依赖项。
// 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"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题
我只想在测试阶段应用 jacoco 并使用 jacoco 库,IEtestCompile仅用于 AAR 构建周期,以便 AAR 的使用者不需要执行上述设置,因为它可能与他们的 APK 构建过程冲突。
我怎样才能只在测试期间需要测试所需的依赖项,而在 AAR 的实际运行时实现的类路径上不需要它们?
IE 我想提供一个 AAR,它不需要客户在类路径上有 jar,也不需要额外的编译时依赖。这可能吗?
编辑1
进一步阅读 jacoco 后,发现 jacoco 依赖于 JavaAgents,而 Dalvik VM(Android) 并不完全支持 JavaAgents。Jacoco 确实有离线模式,但 gradle 插件不支持开箱即用。不过这里有一个功能请求。
有了这些知识,当我想在 build.gradle 中运行分析时,我就有条件地应用了基于属性的插件和任务。
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |