Предупреждение Gradle: 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 до версии 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, чтобы избавиться от предупреждений об устаревании?


person JJD    schedule 23.09.2014    source источник


Ответы (4)


Основываясь на ответе 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)
            }
        }
    }
}
person Thorbear    schedule 10.10.2014
comment
Вы действительно пытались запустить этот код? Я получаю Could not find property 'file' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@4b50996. Этот плагин Android Gradle жесток. - person Merk; 11.10.2014
comment
@Merk На самом деле, да, я пришел сюда в поисках ответа на тот же вопрос, и, наконец, мне удалось заставить его работать с приведенным выше фрагментом (хотя у меня есть немного другой код внутри if). Похоже, вы написали что-то не так, если не можете найти свойство «файл», поскольку в моем фрагменте такое свойство не используется :) - person Thorbear; 11.10.2014
comment
Озадачивает, потому что это оскорбительная строка: output.outputFile = new File(file.parent, "AppName_playstorebuild.apk"). Кстати, я использую classpath 'com.android.tools.build:gradle:0.13.0' - person Merk; 11.10.2014
comment
@Merk А вы включили две строки перед этим? Без def file = output.outputFile свойства "файл", очевидно, не будет. - person Thorbear; 11.10.2014
comment
Судя по моему тестированию, output.outputFile = new File(outputFile.parent, fileName) по-прежнему вызывает это предупреждение. Начал отдельную ветку вопросов здесь - person Zac Sweers; 01.11.2014

Полный фрагмент кода выглядит так:

// 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)
        }
    }
}
person Thomas    schedule 16.10.2014

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

person Larry Schiefer    schedule 23.09.2014
comment
Ни variant.outputs.outputFile.name = "NewBuildName.apk", ни variant.outputs.add(new File("NewBuildName.apk")) не действуют, поэтому я не уверен, какое действие вы предлагаете. - person Merk; 09.10.2014
comment
Где документация, чтобы узнать, какие свойства находятся в выходном объекте? - person whizzle; 06.11.2014
comment
К сожалению, на данный момент это в значительной степени недокументировано. Вы должны полагаться на встроенную справку в Android Studio (не очень полезно) или копаться в коде Groovy/Java в самом плагине, чтобы найти подробности. Поскольку outputs является Collection, вы сможете найти документы по объекту Groovy/Java Collection. - person Larry Schiefer; 06.11.2014

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

person inder    schedule 27.10.2017