android studio 3.1: build:gradle:3.1.0 - Абсолютный путь не поддерживается при установке имени выходного файла
Когда я использую Android Studio 3.0 и использую следующую версию build: gradle in project/build.gradle
:
classpath 'com.android.tools.build:gradle:3.0.1'
И это отлично работает. После обновления до Android Studio 3.1, в результате я обновляю build: gradle:
classpath 'com.android.tools.build:gradle:3.1.0'
И теперь я получаю ошибку в моем app/build.gradle
:
def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
outputFileName = new File(rootProject.projectDir.absolutePath + "/release", releaseFileName.toLowerCase())
Ошибка:
Абсолютный путь не поддерживается при установке имени выходного файла
Мне нужно поставить выходной apk (app-release.apk
) в конкретном пути в проекте. В папке MyProject/release/app-relese.apk
, Как я могу это сделать?
9 ответов
Я думаю, что использование "./../../../" - плохое решение... Я использую общий сценарий gradle для нескольких проектов и хочу сделать код независимым от глубины вывода dir.
После некоторых исследований я нашел это решение для плагинов Gradle 3.1.2:
applicationVariants.all { variant ->
variant.outputs.all { output ->
def relativeRootDir = output.packageApplication.outputDirectory.toPath()
.relativize(rootDir.toPath()).toFile()
output.outputFileName = new File( "$relativeRootDir/release", newOutputName)
}
}
На всякий случай, если это помогает, эта ошибка означает, что теперь нельзя указывать абсолютные пути для чего-либо, связанного с именем файла apk. Я могу прикрепить вас своим ДО и ПОСЛЕ, чтобы добиться того, что мне нужно (чтобы APK был в папке project/app/build/:
ДО gradle 3.1.0
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = new File(
output.outputFile.parent,
output.outputFile.name)
}
}
IN или ПОСЛЕ Gradle 3.1.0
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = new File(
"./../../../../../build/",
output.outputFile.name)
}
}
Самое простое решение, как показано ниже:
Соберите / объедините ваше новое имя файла:
def newFileName = "assemble-your-new-file-name"
Затем просто верните его обратно.
outputFileName = newFileName
Я испытал ту же проблему. Я не приложил усилий, чтобы выяснить, что именно произошло, но есть простое решение.
Просто удалите корень из вашего нового файла и доверьтесь фреймворку, т.е. измените код на
outputFileName = new File("release", releaseFileName.toLowerCase())
Этого было достаточно для нас. Мы не заботимся о том, куда идет apk, только имя apk для определенного аромата.
Я нашел решение:
def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
outputFileName = "/../../../../../release/" + releaseFileName.toLowerCase()
А теперь выходной файл app-release.apk
успех создан в MyProject/release/app-relese.apk
Для градации-6.5.1:
applicationVariants.all { variant ->
variant.outputs.all { output ->
outputFileName = new File("ApkName.apk")
}
}
Я только что обновил наш проект до Gradle 7.6 с версии 4.1.2, в которой удалена возможность установкиoutputFileName
в относительный реж.
Этот код ниже работал у меня. Он копирует выходные данные сборки из ожидаемых каталогов в выбранный вами каталог. В моем случае это было на 2 уровня выше (../../.).
Ключом к этой работе является привязка задачи копирования кassemble
выполнение задач, сfinalizedBy
поэтому он запускается только после создания Apk.
android.applicationVariants.all { variant ->
variant.outputs.all { output ->
File outDir = file("${project.buildDir}/outputs/apk")
File apkDir = file("${project.buildDir}/outputs/apk/${variant.flavorName}/${variant.buildType.name}")
def task = project.tasks.create("publish${variant.name.capitalize()}Apk", Copy)
task.from apkDir
task.into outDir
task.include "**/*"
task.doLast {
println ">>>publish ${variant.name} success!" +
"\nfrom: ${apkDir}" +
"\ninto: ${outDir}"
}
output.assemble.finalizedBy task
}
}
Использование variant.packageApplicationProvider.get().outputDirectory
чтобы избежать предупреждения "optionOutput.getPackageApplication() устарел"
applicationVariants.all { variant ->
variant.outputs.each { output ->
variant.packageApplicationProvider.get().outputDirectory = new File(
project.rootDir.absolutePath + "/release")
def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
output.outputFileName = releaseFileName.toLowerCase()
}
}
Если вы хотите добавить название версии и код версии, сделайте это так:
applicationVariants.all { variant ->
variant.outputs.all {
def versionName = variant.versionName
def versionCode = variant.versionCode
def variantName = variant.name
outputFileName = "${rootProject.name}" + '_' + variantName + '_' + versionName + '_' + versionCode + '.apk'
}
}