Android Studio 3.1:build:gradle:3.1.0 -设置输出文件名时不支持绝对路径

ve7v8dk2  于 2023-03-19  发布在  Android
关注(0)|答案(9)|浏览(166)

当我使用Android Studio3.0并在project/build.gradle中使用下一版本的Android Gradle插件时:

classpath 'com.android.tools.build:gradle:3.0.1'

在我更新到Android Studio3.1之后,我更新了Android 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。我怎么可以做到这一点?

2izufjch

2izufjch1#

以防万一这有帮助,这个错误意味着现在不允许在与APK的文件名相关的任何内容上有绝对路径。我可以附上我的BEFORE和AFTER来实现我所需要的(在project/app/build/文件夹中有APK:

升级3.1.0之前

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        outputFileName = new File(
                output.outputFile.parent,
                output.outputFile.name)
    }
}

在3.1.0年级或之后

applicationVariants.all { variant ->
    variant.outputs.all { output ->
        outputFileName = new File(
                "./../../../../../build/",
                output.outputFile.name)
    }
}
xhv8bpkk

xhv8bpkk2#

我认为使用“./../../../”是一个糟糕的解决方案...我在几个项目中使用通用gradle脚本,我希望代码独立于输出目录的深度。
经过一番研究,我找到了适用于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)
    }
}
im9ewurl

im9ewurl3#

Android Gradle插件3.4.0+最简单的解决方案如下所示:

组合/连接新文件名:

def newFileName = "assemble-your-new-file-name"

然后,只需将其重新赋值

outputFileName = newFileName

具体如下

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        // Redirect your apks to new defined location to outputDirPath
        def outputDirPath = new File("${project.rootDir.absolutePath}/apks/${variant.flavorName}/${variant.buildType.name}")
        variant.packageApplicationProvider.get().outputDirectory = outputDirPath

        def apkFileName = "${rootProject.name}_${android.defaultConfig.versionName}.apk"
        output.outputFileName = apkFileName // directly assign the new name back to outputFileName
    }
}
wyyhbhjk

wyyhbhjk4#

我也遇到过同样的问题,我还没有努力去弄清楚到底发生了什么,但有一个简单的解决办法。
只需从新文件中删除根目录并信任框架,即将代码更改为

outputFileName = new File("release", releaseFileName.toLowerCase())

这对我们来说已经足够了,我们不关心APK去了哪里,只关心特定口味的APK的名称。

x8diyxa7

x8diyxa75#

我找到了解决办法:

def releaseFileName = "${rootProject.name}_${defaultConfig.versionName}.apk"
outputFileName = "/../../../../../release/" + releaseFileName.toLowerCase()

现在,输出文件app-release.apk成功创建于MyProject/release/app-relese.apk

eeq64g8w

eeq64g8w6#

使用variant.packageApplicationProvider.get().outputDirectory以避免警告“*variantOutput.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()
    }
}
ldioqlga

ldioqlga7#

对于Gradle-6.5.1:

applicationVariants.all { variant ->
          variant.outputs.all { output ->
                  outputFileName = new File("ApkName.apk")
          }
 }
ryhaxcpt

ryhaxcpt8#

如果要附加版本名称和版本代码,请执行以下操作:

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'
        }
    }
doinxwow

doinxwow9#

我刚刚将我们的项目从4.1.2版升级到Gradle 7.6版,该版本删除了将outputFileName设置为相对目录的功能。
下面的代码对我来说很有效。它将构建输出从预期的目录复制到您选择的目录。在我的例子中,这是两个级别(../../.)。
这项工作的关键是将复制任务绑定到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
    }
}

相关问题