合并Jacoco结果,混淆和不混淆运行

时间:2019-02-11 11:31:40

标签: android jenkins gradle proguard jacoco

我们有一个多模块Android项目,其中包含应用程序模块,库模块和测试模块(用于通过应用程序测试库模块)。 我们面临一个问题,因为类不匹配,我们无法合并coverage结果。

  

java.lang.IllegalStateException:ID为98bd81913c1da431的不同类名com / xxx / xxx / common / model / cblite / ViewCreator和com / xxx / xxx / common / model / cblite / d。

此不匹配是由混淆引起的。我们想在混淆的应用程序上运行测试,以测试混淆。 但是,当我们直接测试库模块时,就不会混淆它们。

合并任务如下:

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插件并在那里合并结果。但是由于相同的错误,他的效果不佳。

是否有可能合并结果?

1 个答案:

答案 0 :(得分:0)

在我的情况下,proguard参数“ -adaptclassstrings”导致了此问题。 从配置中删除此名称后,jacoco结果再次包含原始名称,因此合并也有效。