39

我在 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

4 回答 4

64

基于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)
            }
        }
    }
}
于 2014-10-10T10:45:56.967 回答
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)
        }
    }
}
于 2014-10-16T14:14:32.343 回答
11

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

于 2014-09-23T15:41:14.823 回答
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中获得更多关于特性和新变化的信息

于 2017-10-27T06:22:35.157 回答