optionOutput.getPackageApplication () устарел - PullRequest
0 голосов
/ 16 января 2019

с 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?

Ответы [ 8 ]

0 голосов
/ 31 июля 2019

виновник нижеследующего предупреждения: output.outputFile

ПРЕДУПРЕЖДЕНИЕ: API 'sequenceOutput.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
0 голосов
/ 20 июня 2019

Итак, у меня возникла та же проблема (на данный момент запущена 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
    }
}
0 голосов
/ 05 июля 2019

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

'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.6'
0 голосов
/ 16 мая 2019

Проблема в том, что 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
    }
}
0 голосов
/ 30 апреля 2019

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

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()
..
0 голосов
/ 21 марта 2019

Обновление подключаемого модуля Fabric к 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 избегания конфигурации задач Gradle, когда они доступны.

0 голосов
/ 28 февраля 2019

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

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
            }
        }
    }
}

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

0 голосов
/ 18 января 2019

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 никак не изменяет поведение.

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