【问题标题】:Could not find property 'processManifest' on com.android.build.gradle.internal.api.ApplicationVariantImpl在 com.android.build.gradle.internal.api.ApplicationVariantImpl 上找不到属性“processManifest”
【发布时间】:2015-02-02 20:38:49
【问题描述】:

我目前正在尝试将 Android Studio 更新到 1.0.0-RC。这似乎需要 gradle Android 插件 1.0.0-rc1。更新后,我开始出现以下错误:

`Could not find property 'processManifest' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@b9da89c.`

经过一番挖掘,processManifest 似乎是在0.14.3 version 中删除的已弃用属性之一。知道新的属性名称是什么吗?新版本没有更新相同的用户指南,所以我找不到任何文档。

编辑:这是需要该属性的代码。我使用它将一些构建时值注入清单:

applicationVariants.all { variant ->
        variant.processManifest << {
            def manifestOutFile = variant.processManifest.manifestOutputFile
            def newFileContents = manifestOutFile.getText('UTF-8')
                    .replace("{GOOGLE_MAPS_KEY}", variant.buildType.ext.google_maps_key)
            manifestOutFile.write(newFileContents, 'UTF-8')
        }
    }

【问题讨论】:

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


    【解决方案1】:

    在 Beta 频道更新到 Android Studio 1.0.0 后,我也遇到了这个错误。但是,我在自己的 gradle 文件中找不到对 processManifest 的任何引用。经过一番搜索,我意识到我需要一个新的 Robolectric gradle 插件:

    https://github.com/robolectric/robolectric-gradle-plugin/releases

    使用 Robolectric Gradle 插件 0.14.0 版(和 Robolectric 2.4 版)已为我解决了该错误。

    【讨论】:

    • 我认为这不适用于我的情况,因为我不使用这个插件。但我确实在类似的项目中看到了类似的问题:gradle-android-test-plugin
    • 你真是个救世主,因为我的问题也是 robolectric。
    • 太棒了!很高兴我能帮上忙。
    • 这也是我的问题。对于从 12 月 5 日开始的 Android Studio 1.0 版本,必须使用 Robolectric 0.14.1 插件(0.14.0 给出的错误是它与 gradle 版本不兼容)
    • 我遇到了同样的问题。但是,我使用的是 JCandK Solutions (robolectric) 插件 (github.com/JCAndKSolutions/android-unit-test) 升级到最新版本的插件修复了它。
    【解决方案2】:

    我无法找到问题的解决方案,而只是一种解决方法。 Android Gradle 插件版本 0.11 引入了一个名为 Manifest merger 的新 API。它允许实现与我的 hack 允许我做的相同的事情。

    以下是所需的更改:

    • "${GOOGLE_MAPS_KEY}"包围你在清单中注入的任何变量
    • 在每个 BuildType 中定义一个 manifestPlaceholders 映射。那就是:

      buildTypes {
          debug {
              manifestPlaceholders = [GOOGLE_MAPS_KEY: "xxxxxxxxxxxxxxxxxxxx"]
          }
          release {
              manifestPlaceholders = [GOOGLE_MAPS_KEY: "xxxxxxxxxxxxxxxxxxxx"]
          }
       }
      

    就是这样!该插件将自动替换您清单中的这些变量。很整洁!

    【讨论】:

    • 你知道有什么方法可以将 manifestPlaceholders 用于特定的 buildType AND 风格吗?这将非常有用。不幸的是,循环槽变体不起作用。
    • 是的,请检查答案中的链接。他们有这样的东西:android { defaultConfig { manifestPlaceholders = [ activityLabel:"defaultName"] } productFlavors { free { } pro { manifestPlaceholders = [ activityLabel:"proName" ] } }
    • 是的,但这只是每种风味的占位符,我需要为特定风味定义占位符,并且仅针对某个 buildType。我似乎能够分别做这两个,但不是两个条件,比如 (if (flavor=="myFlavor" && buildType = "release") 似乎不可能。
    【解决方案3】:

    根据 APK 拆分文档 (http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits),此方法已移至 VariantOutput(可通过 variant.outputs 获得):

    弃用警告:当前变体 API 包含一些已移至其输出下的方法。该方法仍然存在,但如果有 2 个以上的输出将失败。它们将在 1.0 中完全删除 它们是:

    • 获取/设置输出文件
    • getProcessResources
    • getProcessManifest
    • getPackageApplication/库
    • getZipAlign

    VariantOutput 上的其他方法

    • 字符串 getAbiFilter()
    • 字符串 getDensityFilter()
    • 任务 getAssemble()
    • 字符串 getName()
    • 字符串 getBaseName()
    • 字符串 getDirName
    • set/getVersionOverride // 可选版本代码覆盖
    • int getVersionCode() // 从输出中返回 versionCode 覆盖或从变体本身返回 versionCode

    【讨论】:

    • processManifest 既是任务也是方法。 getProcessManifest 将允许检索文件,但不允许检索任务。不过感谢您的回答,这是一个开始!
    • 是的,这不是您问题的完整答案。如果您进一步了解它或发布您自己的答案,请随时对其进行编辑。
    【解决方案4】:
    android.applicationVariants.all{ variant ->
    variant.outputs.each { output ->
        output.processManifest.doLast{ 
        def manifestFile = output.processManifest.manifestOutputFile
        def updatedContent =manifestFile.getText('UTF-8').replaceAll("UMENG_CHANNEL_VALUE", "${variant.productFlavors[0].name}")
        manifestFile.write(updatedContent, 'UTF-8')
        }
    }
    

    }

    我以这种方式对其进行了更改,它只是在旧图层之外添加了一个新图层。这是因为processManifest 现在位于outputs 字段中。 认为这可能会有所帮助。

    【讨论】:

    • 投了反对票,因为答案违背了问题的重点。 processManifest 不再存在于 Android gradle 插件中(截至 1.0.0 rc)。此解决方案不起作用
    • 嗨verybadalloc 我使用的是gradle 1.0.0版,它可以工作,processManifest 不存在于变体属性中,但存在于输出中。
    【解决方案5】:

    在我的情况下,我收到此错误是因为我的 settings.gradle 中指定的库文件夹存在依赖关系。该文件夹显然有很多错误的配置。因此,一旦我将其从 settings.gradle 中删除,项目就编译得很好。

    【讨论】:

      猜你喜欢
      • 2015-03-04
      • 2015-01-22
      • 2015-02-03
      • 2013-01-25
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-09
      相关资源
      最近更新 更多