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