使用Jococo作为依赖项时如何修复Android Studio中的Build.gradle错误?

问题描述

我正在尝试从Github构建一个名为AmazeFileManager的开源项目-AmazeFileManager

我以前已经使用Gradle在Android Studio中构建了项目

Android Gradle插件: 3.6.4
Gradle版本: 5.6.4

问题:

当我尝试将Android插件和Gradle版本更新为

Android Gradle插件: 4.1.0
Gradle版本: 6.5

重建项目时出现此错误:

无法为类型为org.gradle.testing.jacoco.tasks.JacocoReport 的任务':app:jacocoTestFdroidDebugUnitTestReport'设置只读属性'executionData'的值

问题:

该如何解决此错误,以便我可以成功地重建项目?

以下是所使用的Gradle文件的摘要:

build.gradle(Module:app)

buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath 'com.dicedmelon.gradle:jacoco-android:0.1.4'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

plugins {
    id "com.diffplug.gradle.spotless" version "4.3.0"
}

allprojects {

    repositories {
        google()
        jcenter()
        maven { url "https://jitpack.io" }
        maven { url "https://jcenter.bintray.com" }
        mavenCentral()
    }
    tasks.withType(Test) {
        maxParallelForks = 2
        maxHeapSize = "2g"
        forkEvery = 2
    }
}

spotless {
    java {
        licenseHeaderFile 'spotless.license-java'
        target 'app/src/**/*.java'
        googleJavaFormat('1.7')
        removeUnusedImports() // removes any unused imports
        importOrder 'java','javax','org','com','android','androidx',''
    }
}

configurations {
    robo16
    robo17
    robo18
    robo19
    robo21
    robo22
    robo23
    robo24
    robo25
    robo26
    robo27
    robo28
    robo29
}

dependencies {
    robo16 "org.robolectric:android-all:4.1.2_r1-robolectric-r1"
    robo17 "org.robolectric:android-all:4.2.2_r1.2-robolectric-r1"
    robo18 "org.robolectric:android-all:4.3_r2-robolectric-r1"
    robo19 "org.robolectric:android-all:4.4_r1-robolectric-r2"
    robo21 "org.robolectric:android-all:5.0.2_r3-robolectric-r0"
    robo22 "org.robolectric:android-all:5.1.1_r9-robolectric-r2"
    robo23 "org.robolectric:android-all:6.0.1_r3-robolectric-r1"
    robo24 "org.robolectric:android-all:7.0.0_r1-robolectric-r1"
    robo25 "org.robolectric:android-all:7.1.0_r7-robolectric-r1"
    robo26 "org.robolectric:android-all:8.0.0_r4-robolectric-r1"
    robo27 "org.robolectric:android-all:8.1.0-robolectric-4611349"
    robo28 "org.robolectric:android-all:9-robolectric-4913185-2"
    robo29 "org.robolectric:android-all:10-robolectric-5803371"
}

def robolectricDependencies = "${rootProject.buildDir.path}/robolectric"

task fetchRobolectricDependencies(type: Copy) {
    from configurations.robo16
    from configurations.robo17
    from configurations.robo18
    from configurations.robo19
    from configurations.robo21
    from configurations.robo22
    from configurations.robo23
    from configurations.robo24
    from configurations.robo25
    from configurations.robo26
    from configurations.robo27
    from configurations.robo28
    from configurations.robo29
    into robolectricDependencies
}

subprojects {
    afterEvaluate {
        if (project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.library")) {
            android {
                testOptions.unitTests.all {
                    systemProperty 'robolectric.offline','true'
                    systemProperty 'robolectric.dependency.dir',robolectricDependencies
                }
            }

            tasks.withType(Test) {
                it.dependsOn fetchRobolectricDependencies
            }
        }
        if (project.plugins.hasPlugin("jacoco-android")){
            android {
                testOptions.unitTests.all {
                    jacoco {
                        excludes = ['jdk.internal.*']
                    }
                }
            }
        }
        dependencies {
            compileOnly 'com.github.pengrad:jdk9-deps:1.0'

            if (project.hasProperty('kapt')) {
                kapt 'javax.xml.bind:jaxb-api:2.3.1'
                kapt 'com.sun.xml.bind:jaxb-core:2.3.0.1'
                kapt 'com.sun.xml.bind:jaxb-impl:2.3.2'
            }

            annotationProcessor 'javax.xml.bind:jaxb-api:2.3.1'
            annotationProcessor 'com.sun.xml.bind:jaxb-core:2.3.0.1'
            annotationProcessor 'com.sun.xml.bind:jaxb-impl:2.3.2'
        }
    }

}  

build.gradle(Project:AmazeFileManager-release-3.5)

   buildscript {
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:4.1.0'
            classpath 'com.dicedmelon.gradle:jacoco-android:0.1.4'
    
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
    }
    
    plugins {
        id "com.diffplug.gradle.spotless" version "4.3.0"
    }
    
    allprojects {
    
        repositories {
            google()
            jcenter()
            maven { url "https://jitpack.io" }
            maven { url "https://jcenter.bintray.com" }
            mavenCentral()
        }
        tasks.withType(Test) {
            maxParallelForks = 2
            maxHeapSize = "2g"
            forkEvery = 2
        }
    }
    
    spotless {
        java {
            licenseHeaderFile 'spotless.license-java'
            target 'app/src/**/*.java'
            googleJavaFormat('1.7')
            removeUnusedImports() // removes any unused imports
            importOrder 'java',''
        }
    }
    
    configurations {
        robo16
        robo17
        robo18
        robo19
        robo21
        robo22
        robo23
        robo24
        robo25
        robo26
        robo27
        robo28
        robo29
    }
    
    dependencies {
        robo16 "org.robolectric:android-all:4.1.2_r1-robolectric-r1"
        robo17 "org.robolectric:android-all:4.2.2_r1.2-robolectric-r1"
        robo18 "org.robolectric:android-all:4.3_r2-robolectric-r1"
        robo19 "org.robolectric:android-all:4.4_r1-robolectric-r2"
        robo21 "org.robolectric:android-all:5.0.2_r3-robolectric-r0"
        robo22 "org.robolectric:android-all:5.1.1_r9-robolectric-r2"
        robo23 "org.robolectric:android-all:6.0.1_r3-robolectric-r1"
        robo24 "org.robolectric:android-all:7.0.0_r1-robolectric-r1"
        robo25 "org.robolectric:android-all:7.1.0_r7-robolectric-r1"
        robo26 "org.robolectric:android-all:8.0.0_r4-robolectric-r1"
        robo27 "org.robolectric:android-all:8.1.0-robolectric-4611349"
        robo28 "org.robolectric:android-all:9-robolectric-4913185-2"
        robo29 "org.robolectric:android-all:10-robolectric-5803371"
    }
    
    def robolectricDependencies = "${rootProject.buildDir.path}/robolectric"
    
    task fetchRobolectricDependencies(type: Copy) {
        from configurations.robo16
        from configurations.robo17
        from configurations.robo18
        from configurations.robo19
        from configurations.robo21
        from configurations.robo22
        from configurations.robo23
        from configurations.robo24
        from configurations.robo25
        from configurations.robo26
        from configurations.robo27
        from configurations.robo28
        from configurations.robo29
        into robolectricDependencies
    }
    
    subprojects {
        afterEvaluate {
            if (project.plugins.hasPlugin("com.android.application") || project.plugins.hasPlugin("com.android.library")) {
                android {
                    testOptions.unitTests.all {
                        systemProperty 'robolectric.offline','true'
                        systemProperty 'robolectric.dependency.dir',robolectricDependencies
                    }
                }
    
                tasks.withType(Test) {
                    it.dependsOn fetchRobolectricDependencies
                }
            }
            if (project.plugins.hasPlugin("jacoco-android")){
                android {
                    testOptions.unitTests.all {
                        jacoco {
                            excludes = ['jdk.internal.*']
                        }
                    }
                }
            }
            dependencies {
                compileOnly 'com.github.pengrad:jdk9-deps:1.0'
    
                if (project.hasProperty('kapt')) {
                    kapt 'javax.xml.bind:jaxb-api:2.3.1'
                    kapt 'com.sun.xml.bind:jaxb-core:2.3.0.1'
                    kapt 'com.sun.xml.bind:jaxb-impl:2.3.2'
                }
    
                annotationProcessor 'javax.xml.bind:jaxb-api:2.3.1'
                annotationProcessor 'com.sun.xml.bind:jaxb-core:2.3.0.1'
                annotationProcessor 'com.sun.xml.bind:jaxb-impl:2.3.2'
            }
        }
    
    }

  

build.gradle(Module:commons_compress_7z)

apply plugin: 'com.android.library'

android {
    compileSdkVersion 28

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 28
        versionCode 1
        versionName "1.0.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"

    }

    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'),'proguard.cfg'
        }
    }

}

dependencies {
    implementation 'org.apache.commons:commons-compress:1.18'
    implementation 'org.tukaani:xz:1.8'
}

解决方法

如果您还没有找到原因,那是因为新 AGP 使用的 Gradle 6 发生了变化。

有关详细信息,请查看您用来添加 jacoco 任务的 jacoco-android 库中的此 Medium post 或更具体的 this PR

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...