Gradle warning: variant.getOutputFile() и variant.setOutputFile() устарели

Я использую следующую упрощенную конфигурацию в проекте приложения 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 до версии .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 script, чтобы избавиться от предупреждений об устаревании?

Ответ 1

Основываясь на ответе Ларри Шифера, вы можете изменить script на что-то вроде этого:

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

Ответ 2

Полный фрагмент кода выглядит следующим образом:

// Customize generated apk 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)
        }
    }
}

Ответ 3

API-интерфейс вывода версии сборки изменился в последнем плагине Android Gradle. Теперь он позволяет использовать несколько выходных файлов (или каталогов), поэтому этот метод отмечен как устаревший. Если вы используете variant.outputs вместо этого, он даст вам Collection, после чего вы сможете перебрать и получить каждый выходной файл. Вам нужно будет проверить, что файл-объект не является нулевым, и что он соответствует вашим критериям (например, имеет расширение ".apk".) Затем вы можете создать новый объект File и добавить его к выходу в коллекции.

Ответ 4

Плагин Android для Gradle 3.0.0

Вы можете использовать это как

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