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, и она сработала.