在 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?