【发布时间】:2019-07-04 21:26:27
【问题描述】:
我们有一个多模块 Android 项目,其中包含应用程序模块、库模块和测试模块(使用应用程序测试库模块)。 我们面临一个问题,由于类不匹配,我们无法合并覆盖结果。
java.lang.IllegalStateException:不同的类名 com/xxx/xxx/common/model/cblite/ViewCreator 和 com/xxx/xxx/common/model/cblite/d 用于 id 98bd81913c1da431。
这种不匹配是由混淆引起的。我们想在混淆的应用程序上运行我们的测试来测试混淆。 但是当我们直接测试库模块时,它们不能被混淆。
合并任务如下所示:
apply plugin: 'jacoco'
task jacocoRootReport(type: JacocoReport, group: 'Coverage reports') {
project.gradle.taskGraph.whenReady {
def sourceSet = []
def sourceClasses = []
subprojects.each { subproject ->
if (subproject.plugins.hasPlugin('com.android.application') || subproject.plugins.hasPlugin('com.android.library')) {
subproject.android.sourceSets.each { set ->
sourceSet.add(set.java.srcDirs)
}
}
def variants
if (subproject.plugins.hasPlugin('com.android.application')) {
variants = subproject.android.applicationVariants
} else if (subproject.plugins.hasPlugin('com.android.library')) {
variants = subproject.android.libraryVariants
}
if (variants) {
variants.each { variant ->
def compileTask = variant.getJavaCompileProvider().get()
sourceClasses.add(compileTask.destinationDir)
}
}
}
additionalSourceDirs = files(sourceSet)
sourceDirectories = files(sourceSet)
jacocoClasspath = configurations['jacocoAnt']
classDirectories = files(files(sourceClasses).collect {
fileTree(dir: it, exclude: ['**/R.class',
'**/R$*.class',
'**/*__Factory.class',
'**/*__MemberInjector.class',
'**/MemberInjectorRegistry.class',
'**/FactoryRegistry.class',
'**/*Test*.class',
'**/BuildConfig.*'
])
})
executionData = fileTree(project.rootDir.absolutePath).include("**/*.ec", "**/*.exec")
reports {
html.enabled = true
xml.enabled = true
html.destination = file("${buildDir}/reports/jacoco")
xml.destination = file("${buildDir}/reports/jacoco/report.xml")
}
}
}
我们还尝试使用 jenkins jacoco 插件并在那里合并结果。但由于同样的错误,他的效果不佳。
有没有可能合并结果?
【问题讨论】:
-
我只是对未混淆的变体运行覆盖率测量测试,并在需要时对混淆的应用程序测试进行单独的测试,而不使用覆盖率工具。
-
感谢您的想法。我们的想法与解决方法相同,但我们的测试需要一个小时才能运行。因此,运行它们两次将导致构建时间超过 2 小时。这对我们来说不是一个很好的选择。
标签: android jenkins gradle proguard jacoco