【问题标题】:Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性“outputFile”
【发布时间】:2015-01-22 17:03:00
【问题描述】:

更新到 AS 1.0 RC 1 和插件 0.14.4 后,我的 build.gradle 的重命名部分出现问题:

applicationVariants.all { variant ->
            def file = variant.outputFile
            variant.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
        }

现在抛出:

Error:(78, 0) Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@67e7625f.

而且我也无法跳转到 ApplicationVariantImpl 类来查看该属性是如何被重命名的。 有人知道解决方法吗?

【问题讨论】:

  • 你从哪里定义 defaultConfig?

标签: android gradle android-studio android-gradle-plugin build.gradle


【解决方案1】:

试试这个

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def file = output.outputFile
        output.outputFile = new File(file.parent, file.name.replace(".apk", "-" + defaultConfig.versionName + ".apk"))
    }
}

【讨论】:

  • 这实际上解决了我的问题,而且我必须在 android.gradle 文件中设置类路径 'com.android.tools.build:gradle:0.14.2'
  • @Khalid 放在哪里?
  • 在脚本的android-block 中,有一个buildTypes 块。在里面你可以有任何构建配置的块。在我的例子中,代码位于release
  • 这是一个有点误导的答案。在设置 applicationVariants 之前,请确保已更新所有插件或删除任何您不需要的插件。在我的情况下,删除一个行为不端的插件并更新其他插件就足以让构建工作。之后添加或删除此块,使用更全面的示例表单@Chris,无论哪种方式都没有效果。我们会看到我何时尝试运行代码但 gradle 同步没有问题。
  • 谢谢-我将应用程序从 gradle 1.x 升级到 2.3 并遇到此错误,因此无论出于何种原因,问题中发布的代码都适用于较旧的 gradle 版本,但不适用于 2.3 - 这解决了我的问题.
【解决方案2】:

更全面:

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

【讨论】:

  • 在我使用 android studio 1.2beta 时仍然出现错误,gradle plugin 1.0.1
  • 和这个问题一样,在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性 'outputFile'
  • 棘手的情况,实际上前面提到的解决方案总是对我有用(在十几个项目中)。但是,这是一个远景:您可以尝试检查您的依赖项并将它们更新到最新版本。如果您使用多个模块,您可能在其中一个模块中也隐藏了一个过时的脚本。
【解决方案3】:

这可能有几个原因:

1.) 首先如@Khalidov 所说,试试

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        output.outputFile = ...
    }
}

2.) 第二次尝试更新所有其他插件。

例如,我遇到了 Spoon 的这个问题,通过更新 Spoon 解决了这个问题:

classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.14.1'

【讨论】:

    【解决方案4】:

    或者只有一种变体:

    def apk = outputs[0].outputFile
    

    代替

    def apk = variant.outputFile
    

    【讨论】:

      【解决方案5】:

      确保您运行最新的 gradle 版本(不是插件,自行 gradle)。

      检查您的gradle-wrapper.properties。你在运行 gradle 2.1 吗?

      更多关于兼容性的信息:http://tools.android.com/tech-docs/new-build-system/version-compatibility

      【讨论】:

        【解决方案6】:

        我设法解决了以下问题:

        旧:

        buildTypes { 
        libertação {
        
            runProguard false  // esta linha tem que ser mudado
        
            proguardFiles getDefaultProguardFile ( 'android.txt proguard-' ),  'proguard-rules.pro' 
        } 
        

        }

        新:

        buildTypes { 
        libertação {
        
            minifyEnabled false  // nova versão
        
            proguardFiles getDefaultProguardFile ( 'android.txt proguard-' ),  'proguard-rules.pro' 
        } 
        

        }

        按照 ruan65 的这篇文章中的描述在项目的 buil.gradle 文件中进行编辑 Error:(26, 0) Gradle DSL method not found: 'runProguard()'

        在编辑后这一行:

        applicationVariants . all { variant -> 
        variant . outputs . each { output -> 
            def file = output . outputFile 
            output . outputFile =  new  File ( file . parent , file . name . replace ( ".apk" ,  "-"  + defaultConfig . versionName +  ".apk" )) 
        } 
        

        }

        正如上面所说的那样。 这让我安定了!

        【讨论】:

        • 请解释一下你的答案
        猜你喜欢
        • 2015-02-02
        • 2015-02-03
        • 2015-03-04
        • 2013-01-25
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多