在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性“outputFile”

Posted

技术标签:

【中文标题】在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性“outputFile”【英文标题】:Could not find property 'outputFile' on com.android.build.gradle.internal.api.ApplicationVariantImpl 【发布时间】: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? 【参考方案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" )) 
 

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

【讨论】:

请解释一下你的答案

以上是关于在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性“outputFile”的主要内容,如果未能解决你的问题,请参考以下文章

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据

如何在保存在 Mongoose (ExpressJS) 之前在模型中格式化数据