【问题标题】:Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated无法为 ApkVariantOutputImpl_Decorated 设置只读属性“outputFile”的值
【发布时间】:2017-10-26 08:28:22
【问题描述】:

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

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

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

但是更新到AndroidStudio 3.0后却返回如下错误:

无法设置只读属性“outputFile”的值 ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=debug, 过滤器=[]}} 类型 com.android.build.gradle.internal.api.ApkVariantOutputImpl.

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

【问题讨论】:

    标签: android android-gradle-plugin


    【解决方案1】:

    使用output.outputFileName 而不是output.outputFile

    【讨论】:

    【解决方案2】:

    2019 - Gradle 3.0+** 和 3.1.0 的简单解决方案

    在 Android 中更改 APK 的名称

     android { //add inside the android {}
       ......
       applicationVariants.all { variant ->
           variant.outputs.all {
               def flavor = variant.name
               def versionName = variant.versionName
               outputFileName = "prefix_${flavor}_${versionName}.apk"
           }
       }
    }
    

    prefix_release_1.0.1.apk

    【讨论】:

    • 设置输出文件名出现此错误时不支持绝对路径
    • @Keselme 我降低了顶级 build.gradle 文件中的 gradle 工具版本。
    • 这个答案可能对你有帮助stackoverflow.com/questions/46949311/…
    • 无法为 com.android.build.gradle.LibraryExtension 类型的对象获取未知属性“applicationVariants”。
    • @MeLine 立即尝试。
    【解决方案3】:

    试试这个代码:

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

    【讨论】:

      【解决方案4】:

      在 gradle 3.1.0 中或之后

      试试下面的代码

          applicationVariants.all { variant ->
              variant.outputs.all { output ->
                  outputFileName = new File(
                          "release_build", // here you can change the name
                          output.outputFile.name)
              }
      }
      

      【讨论】:

      • 我收到此错误无法为 com.android.build.gradle.internal.api.ApplicationVariantImpl 类型的对象设置未知属性“outputFileName”。
      【解决方案5】:

      在我的情况下,我通过拒绝更新到 Gradle 4.4(在我的情况下)来解决它。因此,当 Studio 要求(当您第一次打开项目时)您更新 Gradle 以支持即时运行等时,只需简单拒绝,你应该没事。

      【讨论】:

        【解决方案6】:

        对我有用的是 1.将each改为“all” 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"))
        }
        

        }

        【讨论】:

          【解决方案7】:

          将您的代码更改为:-

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-10-29
            • 1970-01-01
            • 2022-09-29
            • 1970-01-01
            • 2020-01-02
            • 2013-02-26
            • 2020-09-18
            相关资源
            最近更新 更多