optionOutput.getPackageApplication() устарел

с Gradle 4.10.1 и плагином Android Gradle, обновленным до 3.3.0, я получаю следующее предупреждение:

ПРЕДУПРЕЖДЕНИЕ. API ' variantOutput.getPackageApplication() ' устарел и был заменен на ' variant.getPackageApplicationProvider() '.

строка с окружающим контекстом (который присваивает имена выходных файлов по варианту сборки):

applicationVariants.all { variant ->
    variant.outputs.all { output ->

        if (variant.getBuildType().getName() in rootProject.archiveBuildTypes) {

            def buildType = variant.getBuildType().getName()
            if (variant.versionName != null) {

                def baseName = output.baseName.toLowerCase()
                String fileName = "${rootProject.name}_${variant.versionName}-${baseName}.apk"

                // this is the line:
                outputFileName = new File(output.outputFile.parent, fileName).getName()
            }
        }
    }
}

руководство по миграции не слишком полезно; в то время как в variant.outputs.all может быть ошибка - просто не знаю, чем его заменить - и руководство по миграции ссылается на задачи, а не на создание вариантов. при отключении File → Settings → Experimental → Gradle → Only sync the active variant, я получаю еще больше предупреждений об устаревании (дело в том, что ни один из этих методов не вызывается напрямую):

WARNING: API 'variant.getAssemble()' is obsolete and has been replaced with 'variant.getAssembleProvider()'.
WARNING: API 'variantOutput.getProcessResources()' is obsolete and has been replaced with 'variantOutput.getProcessResourcesProvider()'.
WARNING: API 'variantOutput.getProcessManifest()' is obsolete and has been replaced with 'variantOutput.getProcessManifestProvider()'.
WARNING: API 'variant.getMergeResources()' is obsolete and has been replaced with 'variant.getMergeResourcesProvider()'.
WARNING: API 'variant.getMergeAssets()' is obsolete and has been replaced with 'variant.getMergeAssetsProvider()'.
WARNING: API 'variant.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.
WARNING: API 'variant.getExternalNativeBuildTasks()' is obsolete and has been replaced with 'variant.getExternalNativeBuildProviders()'.
WARNING: API 'variantOutput.getPackageApplication()' is obsolete and has been replaced with 'variant.getPackageApplicationProvider()'.

Вопрос: как можно избежать этих предупреждений об устаревании при переходе на новый API?

Ответы

Ответ 1

variableOutput.getPackageApplication() вызывается измененным вариантом API.

изменение output.outputFile.parent на variant.getPackageApplicationProvider().get().outputs.files[1] является, по крайней мере, временным решением проблемы.

Источник: @Selvin.


variable.getExternalNativeBuildTasks() вызывается плагином io.fabric.

следующая версия плагина io.fabric будет использовать variant.getExternalNativeBuildProviders().

источник: 116408637; подтверждение для обещанного исправления (1.28.1).


Это вызвано com.google.gms.google-services:

  • registerResGeneratingTask is deprecated, use registerGeneratedResFolders(FileCollection)

  • 'variant.getMergeResources()' is obsolete and has been replaced with 'variant.getMergeResourcesProvider()'

В этом блоге объясняется, как вообще избавиться от плагина com.google.gms.google-services, добавив ресурсы XML, которые генерирует этот плагин, например. из build/generated/res/google-services/debug/values/values.xml в обычный debug/values/values.xml.


Наиболее легким и наименьшим усилием может быть:

buildscript {
    repositories {
        google()
        maven { url "https://maven.fabric.io/public" }
    }
    dependencies {
        //noinspection GradleDependency
        classpath "com.android.tools.build:gradle:3.2.1"
        classpath "io.fabric.tools:gradle:1.28.1"
    }
}

Для отладочной информации: ./gradlew -Pandroid.debug.obsoleteApi=true mobile:assembleDebug

Ни один из них warnings никак не меняет поведение.

Ответ 2

Обновите плагин Fabric Gradle до 1.28.1

dependencies {
   classpath 'io.fabric.tools:gradle:1.28.1'
}

Changelog: https://docs.fabric.io/android/changelog.html#march-15-2019

Устранены устаревшие предупреждения API, если они доступны, переходя на API избегания конфигурации задач Gradles.

Ответ 3

Вы можете использовать более простой, похожий на этот пример:

applicationVariants.all { variant ->
            variant.outputs.all { output ->
                outputFileName = "${globalScope.project.name}-${variant.versionName}_${output.baseName}.apk"
            }
        }

и результатом будет my_app-1.9.8_flavor1-release.apk.

В вашем коде проблемной частью (которая генерирует предупреждение) является output.outputFile:

..
outputFileName = new File(output.outputFile.parent, fileName).getName()
..

Ответ 4

Проблема в том, что output.outputFile внутренне вызывает getPackageApplication()

Я решил эту проблему, установив каталог и имя выходного файла самостоятельно.

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputDir = new File("${project.buildDir.absolutePath}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")
        def outputFileName = "app-${variant.flavorName}-${variant.buildType.name}.apk"
        // def outputFile = new File("$outputDir/$outputFileName")

        variant.packageApplicationProvider.get().outputDirectory = new File("$outputDir")
        output.outputFileName = outputFileName
    }
}

Ответ 5

Таким образом, у меня возникла та же проблема (на момент запуска Gradle 5.4.1). Кроме того, я не увидел ответа, который бы эффективно охватывал как проекты приложений, так и библиотечные проекты.

Таким образом, я хотел сделать что-то, что теоретически можно было бы использовать в любом проекте, чтобы сделать единый build.gradle для всего проекта, если это необходимо. Поскольку все оказалось довольно хорошо, я решил добавить его на тот случай, если кто-то захочет что-то, что будет работать как для приложений, так и для библиотечных проектов.

Соответствующая часть здесь.

android {
    if (it instanceof com.android.build.gradle.AppExtension) {
        it.applicationVariants.all { com.android.build.gradle.api.ApplicationVariant variant ->
            configureOutputFileName(variant, project)
        }
    } else if (it instanceof com.android.build.gradle.LibraryExtension) {
        it.libraryVariants.all { com.android.build.gradle.api.LibraryVariant variant ->
            configureOutputFileName(variant, project)
        }
    }
}

Который просто вызывает метод ниже.

@SuppressWarnings("UnnecessaryQualifiedReference")
private void configureOutputFileName(com.android.build.gradle.api.BaseVariant variant, Project project) {
    variant.outputs.all { output ->
        def buildType = variant.buildType.name
        String tmpOutputFileName = outputFileName
        if (variant instanceof com.android.build.gradle.api.ApplicationVariant) {
            String fileName = "${project.name}-${variant.versionName}_${buildType}.apk"
            def defaultOutputDir = variant.packageApplicationProvider.get().outputDirectory
            tmpOutputFileName = new File(defaultOutputDir.absolutePath, fileName).name
        }
        if (variant instanceof com.android.build.gradle.api.LibraryVariant) {
            String fileName = "${project.name}_${buildType}.aar"
            def defaultOutputDir = variant.packageLibraryProvider.get().destinationDirectory.asFile.get()
            tmpOutputFileName = new File(defaultOutputDir.absolutePath, fileName).name
        }
        println(tmpOutputFileName)
        outputFileName = tmpOutputFileName
    }
}

Ответ 6

Раньше я писал так:

android.applicationVariants.all { variant ->
    if ("release" == variant.buildType.name) {
        variant.outputs.all { output ->
            outputFileName = output.outputFile.name.replace("-release", "")
        }
        variant.assemble.doLast {
            variant.outputs.all { output ->
                delete output.outputFile.parent + "/output.json"
                copy {
                    from output.outputFile.parent
                    into output.outputFile.parentFile.parent
                }
                delete output.outputFile.parent
            }
        }
    }
}

Предупреждение появляется каждый раз, как открыть AS, синхронизировать, очистить...

Затем я нашел способ написать, он будет отображаться в сборке, но не будет появляться каждый раз.

android.applicationVariants.all { variant ->
    if ("release" == variant.buildType.name) {
        assembleRelease.doLast {
            variant.outputs.all { output ->
                delete output.outputFile.parent + "/output.json"
                copy {
                    from output.outputFile.parent
                    into output.outputFile.parentFile.parent
                    rename { filename ->
                        filename.replace("-release", "")
                    }
                }
                delete output.outputFile.parent
            }
        }
    }
}

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

Ответ 7

Я не использовал output.outputFile.parent в своем gradle. Причиной устаревшего предупреждения в variantOutput.getPackageApplication() стал плагин dex count. Я обновил его до 0.8.6, и предупреждение исчезло.

'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.6'

Ответ 8

Виновным в следующем предупреждении является output.outputFile

ПРЕДУПРЕЖДЕНИЕ. API 'OptionOutput.getPackageApplication()' устарел и был заменен на 'variable.getPackageApplicationProvider()'.

Чтобы избавиться от этого предупреждения для плагина Android Gradle 3.4. 0+, вы можете вручную собрать путь вывода, как показано ниже:

def selfAssembledOutputPath = new File("${project.buildDir.absolutePath}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")

Затем замените строку ниже на selfAssembledOutputPath, определенный выше

// this is the line:
outputFileName = selfAssembledOutputPath

Ответ 9

Вы также можете использовать более старую версию Gradle. Я изменил версию Gradle с 3.5.0 на 3.2.1, и она сработала.enter image description here