Ошибка: выполнение выполнено для задачи ': app: transformClassesWithFirebasePerformancePluginForRelease'

Я не могу найти происхождение этой ошибки при компиляции в режиме деблокирования. У меня создалось впечатление, что эта ошибка появилась без изменения моего кода (я пытаюсь вернуться с github, но у меня все еще есть эта ошибка).

Ошибка: выполнение выполнено для задачи ': Приложение: transformClassesWithFirebasePerformancePluginForRelease'.

java.io.IOException: указанный путь не найден

Gradle с флагом отладки

22: 36: 11.767 [ERROR] [FirebasePerformancePlugin] Невозможно выполнить команду org/apache/xmlbeans/impl/schema/SchemaTypeSystemCompiler.class

My build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        maven { url 'https://maven.fabric.io/public' }
        maven {
            url 'https://maven.google.com'
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
        classpath 'com.google.gms:google-services:3.1.0'
        classpath 'com.google.firebase:firebase-plugins:1.1.0'
        classpath 'io.fabric.tools:gradle:1.+'
    }
}

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://www.idescout.com/maven/repo/'
        }
        maven {
            url 'https://maven.google.com'
        }
    }
}

Мое приложение /build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.firebase-perf'
apply plugin: 'io.fabric'

android {

    compileSdkVersion 26
    buildToolsVersion '26.0.0'
    defaultConfig {
        applicationId ""
        minSdkVersion 16
        targetSdkVersion 26
        multiDexEnabled true

        vectorDrawables.useSupportLibrary = true
        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
            signingConfig signingConfigs.Keys
        }
        debug {
            signingConfig signingConfigs.Keys
        }
    }
    dexOptions {
        jumboMode = true
    }

    packagingOptions {
        pickFirst 'META-INF/*'
    }
}

repositories {
    jcenter()
}
repositories {
    maven { url "http://repo1.maven.org/maven2" }
    maven { url 'https://jitpack.io' }
    maven { url 'https://maven.fabric.io/public' }
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')

    compile 'com.android.support:appcompat-v7:26.0.0-beta2'
    compile 'com.android.support:support-v13:26.0.0-beta2'
    compile 'com.android.support:support-v4:26.0.0-beta2'
    compile 'com.android.support:design:26.0.0-beta2'
    compile 'com.android.support:recyclerview-v7:26.0.0-beta2'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:cardview-v7:26.0.0-beta2'
    compile 'com.android.support:customtabs:26.0.0-beta2'

    //firebase
    compile 'com.google.firebase:firebase-ads:11.0.2'
    compile 'com.google.firebase:firebase-core:11.0.2'
    compile 'com.google.firebase:firebase-messaging:11.0.2'
    compile 'com.google.firebase:firebase-auth:11.0.2'
    compile 'com.google.firebase:firebase-database:11.0.2'
    compile 'com.google.firebase:firebase-config:11.0.2'
    compile 'com.google.firebase:firebase-storage:11.0.2'
    compile 'com.google.firebase:firebase-perf:11.0.2'
    compile 'com.firebaseui:firebase-ui-auth:1.2.0'

    //Fabric
    compile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
        transitive = true;
    }


    compile 'com.android.support:support-vector-drawable:26.0.0-beta2'
    compile 'commons-io:commons-io:2.5'

    compile 'com.android.support:multidex:1.0.1'
    compile files('libs/aa-poi-ooxml-schemas-3.10-reduced-more-0.1.5.jar')
    compile files('libs/aa-poi-3.10-min-0.1.5.jar')
}

apply plugin: 'com.google.gms.google-services'

Ответ 1

После переноса моего проекта Android в Gradle Kotlin DSL я также неожиданно получаю ошибку Can't instrument с помощью плагина производительности Firebase для любого класса проекта, включая сторонние зависимости. Сборка в конечном итоге прерывается с OutOfMemoryError. Ошибка

Can't instrument: ...
java.lang.IllegalArgumentException
        at org.objectweb.asm.ClassVisitor.<init>(ClassVisitor.java:79)
        at com.google.firebase.perf.plugin.instrumentation.InstrumentationVisitor.<init>(InstrumentationVisitor.java:55)
        ...

Глядя на исходный код ASM ClassVisitor, я вижу, что IllegalArgumentException добавляется в конструктор, когда передается необработанная версия API. perf-plugin требует версии 7.0 ASM. Однако, проверяя зависимости проекта с помощью ./gradlew :app:dependencies, я обнаружил, что используется версия 6.0 ASM. Очевидно, что для некоторых других зависимостей требуется 6.0.

Я попытался явно перезаписать зависимость ASM с помощью

configurations.all {
    resolutionStrategy.eachDependency {
        if (requested.group == "org.ow2.asm") {
            useVersion("7.0")
            because("Version required by Firebase Performance Plugin")
        }
    }
}

и в выводе ./gradlew :app:dependencies я теперь вижу, что используется 7.0, но я все еще получаю эту ошибку: (

Обновление: Понижение com.google.firebase:firebase-plugins с 1.2.0 до 1.1.5 решает проблему для меня.

Обновление 2: Начиная с версии 2.0.0 firebase-plugins его использование устарело. Рекомендуемое решение - использовать плагин Performance Monitoring явно. После перехода на новый плагин проблема теперь для меня решена.

Обновление 3: Я должен отозвать свое предыдущее выражение. Использование плагина Performance Monitor исправило сборку на моем локальном компьютере, но не на моем сервере сборки Jenkins. Также перемещение блока configurations.all, упомянутого выше, в блок buildscript, как прокомментировал Антимонит, не исправило сборку, хотя я могу видеть в выходных данных ./gradlew buildEnvironment, что ASM 7.0 используется для сборки.

Ответ 2

Причина: когда зависимость classpath от perf-plugin определена в файле build.gradle уровня build.gradle вместо файла build.gradle уровня build.gradle, perf-plugin (во время выполнения) получает ASM v6 dep, даже если в нем POM файл ASM V7 Деп объявлен. Это вызывает исключение IllegalArgumentException в perf-plugin v1.2.0 и v1.2.1 потому что они зависят от ASM v7, однако это прекрасно работает для v1.1.5 потому что это зависит от ASM v6.

Есть множество сообщений здесь, объясняющие, почему путь к классам верхнего уровня buildscript предназначен, чтобы отличаться от остальной части проекта:


Решение: это поведение gradle. Быстрое решение этой проблемы состоит в том, чтобы определить зависимость perf-plugin только в корневом проекте build.gradle (который уже упоминался в открытых документах).


Детальное объяснение:

Нет ошибок

root-проект build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath 'com.google.firebase:perf-plugin:1.2.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

уровень приложения build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.firebase-perf'


. . .

dependencies {
    implementation 'com.google.firebase:firebase-perf:17.0.2'
}

BUG

root-проект build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

уровень приложения build.gradle

buildscript {
    repositories {
        google()
        jcenter()
    }

    dependencies {
        classpath 'com.google.firebase:perf-plugin:1.2.1'
    }
}

apply plugin: 'com.android.application'
apply plugin: 'com.google.firebase.firebase-perf'


. . .

dependencies {
    implementation 'com.google.firebase:firebase-perf:17.0.2'
}

Сравнение команды $./gradlew clean :buildEnvironment в обоих случаях показывает, что все ссылки на org.ow2.asm:asm:6.0 преобразуются в org.ow2.asm:asm:7.0 в случае отсутствия org.ow2.asm:asm:7.0 но это не так произошло в случае ошибки:

Нет ошибок

> Task :buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

.  .  .

    +--- com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta04
|    |    +--- org.ow2.asm:asm:6.0 -> 7.0
|    |    +--- org.ow2.asm:asm-util:6.0 (*)
|    |    +--- org.ow2.asm:asm-commons:6.0 (*)
|    |    +--- org.jdom:jdom2:2.0.6
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.0 -> 1.3.31 (*)
|    |    \--- com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04 (*)
|    +--- com.google.protobuf:protobuf-java:3.4.0
|    \--- com.google.protobuf:protobuf-java-util:3.4.0 (*)
\--- com.google.firebase:perf-plugin:1.2.1
     \--- org.ow2.asm:asm:7.0

BUG

> Task :buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

.  .  .

     +--- com.android.tools.build.jetifier:jetifier-processor:1.0.0-beta04
     |    +--- org.ow2.asm:asm:6.0
     |    +--- org.ow2.asm:asm-util:6.0 (*)
     |    +--- org.ow2.asm:asm-commons:6.0 (*)
     |    +--- org.jdom:jdom2:2.0.6
     |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.0 -> 1.3.31 (*)
     |    \--- com.android.tools.build.jetifier:jetifier-core:1.0.0-beta04 (*)
     +--- com.google.protobuf:protobuf-java:3.4.0
     \--- com.google.protobuf:protobuf-java-util:3.4.0 (*)