无法设置只读属性的值" outputFile'对于ApkVariantOutputImpl_Decorated

时间:2017-10-26 08:28:22

标签: android android-gradle

我在gradle脚本中使用以下代码重命名使用AndroidStudio生成的apks:

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = new File(output.outputFile.parent, defaultConfig.versionCode + "_" + output.outputFile.name)
    }
}

所以它生成的apks名称如下: 345-app-release.apk ,其中345是versionCode。

但在更新到AndroidStudio 3.0后,它会返回以下错误:

  

无法设置只读属性的值" outputFile'对于   ApkVariantOutputImpl_Decorated {apkData = Main {type = MAIN,fullName = debug,   filters = []}}类型   com.android.build.gradle.internal.api.ApkVariantOutputImpl。

如何使用新的构建工具实现类似的重命名。

6 个答案:

答案 0 :(得分:77)

使用output.outputFileName代替output.outputFile

答案 1 :(得分:8)

尝试此代码:

buildTypes {

       applicationVariants.all { variant ->
            variant.outputs.each { output ->
                def name = "myapp_v${variant.versionName}(${variant.versionCode}).apk"
                output.outputFileName = name
            }
        }

    }

答案 2 :(得分:4)

  

在gradle 3.1.0中或之后

尝试以下代码

discard

答案 3 :(得分:1)

在我的情况下,我通过拒绝更新到Gradle 4.4(在我的情况下)来解决它。所以当Studio询问时(当你第一次打开你的项目时)你更新Gradle以支持即时运行等等拒绝,你应该没事。

答案 4 :(得分:0)

将您的代码更改为: -

    applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = new File(output.outputFile.parent, "${variant.applicationId}-${variant.versionName}.apk")
    }
}

答案 5 :(得分:0)

对我有用的是 1.将每个更改为“全部” 2.将 output.outputFile 更改为“ outputFileName” 3.在终端中运行 $。/ gradlew clean build

例如,如果您的artifacts.gradle设置为:

android.applicationVariants.all { variant ->

variant.outputs.each { output ->
    def finalVersionCode = 10000 + versionCode
    output.versionCodeOverride = finalVersionCode
    output.outputFile = new File(
         output.outputFile.parent,       output.outputFile.name.replace(".apk","-${finalVersion}.apk"))
}

}

然后您要将其更改为此:

android.applicationVariants.all { variant ->

variant.outputs.all { output ->
    def finalVersionCode = 10000 + versionCode
    output.versionCodeOverride = finalVersionCode
    outputFileName = new File(
         output.outputFile.parent,
         outputFileName.replace(".apk", "-${finalVersionCode}.apk"))
}

}