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

时间:2018-03-28 08:56:09

标签: android-studio android-studio-3.0

当我使用Android Studio 3.0 时,我在project/build.gradle中使用下一版 Android Gradle Plugin

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

它的工作正常。 在我更新到Android Studio 3.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中。我怎么能这样做?

8 个答案:

答案 0 :(得分:21)

如果这有帮助,这个错误意味着现在不允许在与apk的文件名相关的任何内容上有绝对路径。我可以在我之前和之后附上你以实现我所需要的(在项目/ app / build /文件夹中拥有APK:

BEFORE gradle 3.1.0

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

IN或AFTER gradle 3.1.0

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

答案 1 :(得分:11)

我认为使用“./../../../”是一个糟糕的解决方案......我为几个项目使用通用的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)
    }
}

答案 2 :(得分:8)

我遇到了同样的问题。我没有努力弄清楚究竟发生了什么,但有一个简单的解决办法。

只需从新文件中删除root并信任该框架,即将代码更改为

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

这对我们来说已经足够了。我们不关心apk的位置,只关注特定风味的apk的名称。

答案 3 :(得分:2)

我找到了解决方案:

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

现在在app-release.apk

中创建输出文件MyProject/release/app-relese.apk成功

答案 4 :(得分:1)

最简单的解决方案如下:

组装/连接新文件名:

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

然后简单地将其分配回来

outputFileName = newFileName

答案 5 :(得分:1)

对于 gradle-6.5.1:

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

答案 6 :(得分:0)

使用error[E0308]: mismatched types --> src/main.rs:3:20 | 3 | let nums: () = a | ____________________^ 4 | | .chars() 5 | | .map(|c| c.to_digit(10).unwrap()) 6 | | .collect::<Vec<u32>>(); | |______________________________^ expected (), found struct `std::vec::Vec` | = note: expected type `()` found type `std::vec::Vec<u32>` 来避免警告“ variantOutput.getPackageApplication()已过时

variant.packageApplicationProvider.get().outputDirectory

答案 7 :(得分:0)

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

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