Gradle variantOutput.getPackageApplication()已过时

Gradle variantOutput.getPackageApplication()已过时,gradle,android-gradle-plugin,build.gradle,deprecation-warning,build-variant,Gradle,Android Gradle Plugin,Build.gradle,Deprecation Warning,Build Variant,随着Gradle4.10.1和Android Gradle插件更新为3.3.0,我得到以下警告: 警告:API“variantOutput.getPackageApplication()”已过时,已被替换为“variant.getPackageApplicationProvider()” 该行及其周围的上下文(按构建变量分配输出文件名): 这个方法没有太大帮助;而variant.outputs.all可能出了问题-只是不知道该用什么替换它-迁移指南中提到了任务而不是构建变量。禁用文件时→ 设置→

随着Gradle
4.10.1
和Android Gradle插件更新为
3.3.0
,我得到以下警告:

警告:API“
variantOutput.getPackageApplication()
”已过时,已被替换为“
variant.getPackageApplicationProvider()

该行及其周围的上下文(按构建变量分配输出文件名):

这个方法没有太大帮助;而
variant.outputs.all
可能出了问题-只是不知道该用什么替换它-迁移指南中提到了任务而不是构建变量。禁用
文件时→ 设置→ 实验的→ 格拉德尔→ 仅同步活动变量
,我会收到更多的弃用警告(问题是,这些方法都没有被直接调用):

问:如何通过迁移到新API来避免这些弃用警告?

variantOutput.getPackageApplication()是由更改的variant API引起的


output.outputFile.parent
更改为
variant.getPackageApplicationProvider().get().outputfiles[1]
至少是一种临时解决方法

来源:


variant.getExternalNativeBuildTasks()是由
io.fabric
插件引起的

下一版本的
io.fabric
插件将使用
variant.getExternalNativeBuildProviders()

资料来源:;对于承诺的修复(
1.28.1


这些是由
com.google.gms.google服务引起的:

  • registerResGeneratingTask已弃用,请使用registerGeneratedResFolders(FileCollection)

  • “variant.getMergeResources()”已过时,已替换为“variant.getMergeResourcesProvider()”

这说明了如何通过将插件生成的XML资源(例如从
build/generated/res/google services/debug/values/values.XML
添加到常规的
debug/values/values.XML
中,从而完全摆脱
com.google.gms.google服务
插件


最简单、最省力的方法可能是:

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


所有这些
警告都不会以任何方式改变行为。

我过去常这样写:

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
            }
        }
    }
}
每次都会弹出警告,如打开为、同步、清除

然后我找到了一种写的方法,它只会出现在构建中,但不会每次都弹出

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

如果你只是不想每次都弹出警告,这些可能会给你一些提示。

将Fabric gradle插件更新为1.28.1

dependencies {
   classpath 'io.fabric.tools:gradle:1.28.1'
}
更改日志:

通过切换到Gradle的任务配置避免API(如果可用),消除了过时的API警告


您可以使用更简单的方法,类似于此示例:

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()
..

问题是
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
    }
}

所以我得到了同样的问题(截至目前,运行Gradle 5.4.1)。此外,我并没有看到一个有效地涵盖应用程序项目和库项目的答案

因此,如果需要的话,我想制作一些理论上可以用于任何项目的东西,为整个项目制作一个build.gradle。因为结果很好,所以我想我应该添加它,以防有人想要同时适用于应用程序和库项目的东西

编辑: 自最初发布此方法以来,我已对其进行了更新/优化。我现在将gradle 6.3与Kotlin DSL一起使用,下面的工作非常顺利

编辑2: Android Gradle build tools 4.1.0(beta版)中的某个地方似乎默认情况下禁用了库项目的生成配置,因此我不得不更改一行,以接受带有备份的空值,更新如下

/**
*为提供的变量的所有输出配置输出文件名。就是
*提供的应用程序或库。
*
*@param variant随{android.defaultConfig.applicationVariants.all.this}传入
*@param project从中获取文件名的项目。提示:使用rootProject
*@param formatString文件名的格式字符串,将使用三个
*参数:(1)项目名称,(2)版本名称,(3)生成类型。“.apk”或“.aar”是
*自动追加。如果未提供,则默认为“%1$s-%2$s\u3$s”
*/
@抑制警告(“不必要的限定引用”)
有趣的配置输出文件名(
变体:com.android.build.gradle.api.BaseVariant,
项目:项目,,
formatString:String=“%1\$s-%2\$s\%3\$s”
) {
variant.outputs.configureEach{
val fileName=formatString.format(project.name,
outputVariant.generateBuildConfigProvider.orNull?.versionName?.orNull?:
project.version,variant.buildType.name)
val tmpOutputFile:File=when(变量){
是com.android.build.gradle.api.ApplicationVariant->
文件(variant.packageApplicationProvider!!.get().outputDirectory.asFile)
.get().absolutePath,“$fileName.apk”)
是com.android.build.gradle.api.LibraryVariant->
文件(variant.packageLibraryProvider!!.get().destinationDirectory.asFile)
.get().absolutePath,“$fileName.aar”)
else->outputFile
}
(这是com.android.build.gradle.internal.api.BaseVariantOutputImpl)
.outputFileName=tmpOutputFile.name
println(“输出文件设置为\“${tmpOutputFile.canonicalPath}\”)
}
}

原件:
..
outputFileName = new File(output.outputFile.parent, fileName).getName()
..
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
    }
}
'com.getkeepsafe.dexcount:dexcount-gradle-plugin:0.8.6'
def selfAssembledOutputPath = new File("${project.buildDir.absolutePath}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")
// this is the line:
outputFileName = selfAssembledOutputPath
def variant = findYourVariantSomehow()
def output = findCorrectOutputInVariant(variant)
def fileName = output.outputFileName

def fileDir = variant.packageApplicationProvider.get().outputDirectory.get()

def apkFile = file("$fileDir/$fileName")