Gradle警告:不推荐使用variant.getOutputFile()和variant.setOutputFile()

时间:2014-09-23 14:36:02

标签: android gradle build.gradle deprecation-warning

我在Android应用程序项目中使用以下简化配置。

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 20
        versionCode 1
        versionName "1.0.0"

        applicationVariants.all { variant ->
            def file = variant.outputFile
            def fileName = file.name.replace(".apk", "-" + versionName + ".apk")
            variant.outputFile = new File(file.parent, fileName)
        }
    }    
}

现在我已将Gradle插件更新到v.0.13.0并将Gradle更新到v.2.1。出现以下警告:

WARNING [Project: :MyApp] variant.getOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead.
WARNING [Project: :MyApp] variant.setOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead.
WARNING [Project: :MyApp] variant.getOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead.
WARNING [Project: :MyApp] variant.setOutputFile() is deprecated. 
    Call it on one of variant.getOutputs() instead. 

如何重写Groovy脚本以消除弃用警告?

4 个答案:

答案 0 :(得分:59)

根据Larry Schiefer的答案,您可以将脚本更改为以下内容:

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def outputFile = output.outputFile
            if (outputFile != null && outputFile.name.endsWith('.apk')) {
                def fileName = outputFile.name.replace('.apk', "-${versionName}.apk")
                output.outputFile = new File(outputFile.parent, fileName)
            }
        }
    }
}

答案 1 :(得分:16)

完整的代码段如下所示:

// Customize generated apk's name with version number
applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def outputFile = output.outputFile
        if (outputFile != null && outputFile.name.endsWith('.apk')) {
            def manifestParser = new com.android.builder.core.DefaultManifestParser()
            def fileName = outputFile.name.replace(".apk", "-DEBUG-" + manifestParser.getVersionName(android.sourceSets.main.manifest.srcFile) + ".apk")
            output.outputFile = new File(outputFile.parent, fileName)
        }
    }
}

答案 2 :(得分:9)

最新的Android Gradle插件中的构建变量输出API已更改。它现在允许多个输出文件(或目录),这就是为什么此方法已被标记为已弃用。如果您改为使用variant.outputs,它会为您提供Collection,然后您可以迭代并获取每个输出文件。您必须验证文件对象是非空的并且它符合您的条件(例如,具有'.apk'扩展名。)然后您可以创建一个新的File对象并将其添加到输出中采集。

答案 3 :(得分:4)

Gradle 3.0.0的Android插件

你可以这样使用

android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "${variant.name}-${variant.versionName}.apk"
    }
}

您可以获得有关Android文档的功能和新变化的更多信息 https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#update_gradle