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'
        }
    }
Другие вопросы по тегам