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

Posted

技术标签:

【中文标题】合并 Jacoco 结果,混淆和非混淆运行【英文标题】:Merge Jacoco results, obfuscated and not obfuscated runs 【发布时间】: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 小时。这对我们来说不是一个很好的选择。 【参考方案1】:

在我的例子中,proguard 参数“-adaptclassstrings”导致了这个问题。 从配置中删除它后,jacoco 结果再次包含原始名称,因此合并也可以正常工作。

【讨论】:

以上是关于合并 Jacoco 结果,混淆和非混淆运行的主要内容,如果未能解决你的问题,请参考以下文章

折腾一两天,终于学会使用grunt压缩合并混淆JS脚本,小激动,特意记录一下+spm一点意外收获

ASP.Net一键自动化更新代码编译合并dll压缩jscss混淆dllzip打包发布到测试环境的bat批处理

Gradle ShadowJar 输出包含混淆和非混淆类

ClearCase:2 个分支中的文件相互混淆

Android Gradle 构建生成的 apk 包含混淆和非混淆类

Master Theorem混淆与三种情况