在 Android Gradle 构建中禁用清单合并

Posted

技术标签:

【中文标题】在 Android Gradle 构建中禁用清单合并【英文标题】:Disable Manifest Merger in Android Gradle Build 【发布时间】:2012-12-05 21:42:15 【问题描述】:

我正在使用新的 gradle android 构建系统。

项目由两个android库项目和一个主项目组成。

使用 ant 构建,必须在 project.properties 中启用清单合并。但是在使用 gradle 构建系统时,默认情况下会启用清单合并。如何禁用清单合并?

【问题讨论】:

我很想知道您为什么要禁用它?我们不打算启用它(目前),但我们希望支持所有用例。 @Xav:到目前为止,我们使用 ant 构建了我们的项目,并且没有在我们的库项目中处理任何 AndroidManifest.xml。因此,由于明显的合并错误,我们在迁移到 gradle 时遇到了一些问题。 @Xav:我也希望我可以禁用合并。清单合并似乎优先考虑 main 中的清单。我有价值观,即我的风格中的“图标”需要覆盖 main,但合并正在丢弃这些价值观。 @DouglasFerguson 你的意思是 android:icon 属性?为什么只是覆盖flavor的资源文件夹中的图标本身? @XavierDucrohet 我也遇到了同样的事情,但我只需要在发布产品风格的 android 清单的清单元素中添加一个额外的属性,即 android:sharedUserId。我该怎么做? 【参考方案1】:

编辑:这实际上是可能的,虽然是间接的,从 0.3 开始

您需要做的是禁用 processManifest 任务,使其不会运行并告诉 processResources 要使用的清单在哪里:

android.applicationVariants.all  variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false

请注意,如果您通过 DSL 自定义应用程序包名称,则应在默认位置保持默认清单不变,以便为 R 类提供一致的包名称,然后将手动合并的清单放在其他位置并指向每个变种 processResources 任务交给他们。

【讨论】:

我在尝试这个时收到“在 com.android.build.gradle.AppExtension_Decorated@57eaaca 上找不到属性 'buildVariants'”。 +1 这对于 0.5+ 插件不再有效,并且文档无助于理解如何排除某些库的清单。【参考方案2】:

这可能会有所帮助。

 android.applicationVariants.all variant ->
       variant.outputs.each  output ->
         output.processResources.manifestFile = file('AndroidManifest.xml')
         output.processManifest.enabled=false
       
  

【讨论】:

它适用于 2.10 插件。清单文件路径应为 'src/main/AndroidManifest.xml'【参考方案3】:

对于 0.6.+ 插件,您还必须将 buildVariants 更改为 applicationVariants

android.applicationVariants.all  variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false

【讨论】:

需要在哪个文件中进行此更改? 通过将其粘贴到应用程序的build.gradle 中,我收到错误:错误:(92, 0) 在 com.android.build.gradle.internal.api 上找不到属性“processResources”。 ApplicationVariantImpl_Decorated@68ff5866。 打开文件【参考方案4】:

这些解决方案似乎不适用于 1.0 插件:

找不到属性“processResources” com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@774f1d0b。

有人有更新吗?我们的问题是 recyclerview-v7:21.0.3 的最终 apk 中出现了一个杂散活动:

<activity
   android:label="RecyclerViewTestActivity"
   android:name="android.support.v7.widget.TestActivity"/>

更新:看起来可以配置清单合并(请参阅http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger)。在这种特定情况下,来自 recyclerview-v7 库的 TestActivity 可以通过以下方式删除:

<activity
    android:name="android.support.v7.widget.TestActivity"
    android:label="RecyclerViewTestActivity"
    tools:node="remove"/>

谢谢Filip。

【讨论】:

我的应用程序的问题是生成的 apk 在其中具有 Read_Contacts 权限,但是我没有在清单中声明它。不知道如何解决这个问题。 @ShajeelAfzal 检查build/outputs/logs/manifest-merger-debug-report.txt 以查看build/intermediates/manifests/full/debug/AndroidManifest.xml 中的每个位来自何处。 (在旧版本中可能不可用或位于不同的文件中;我使用的是 2.0.0。)【参考方案5】:

对于 0.5.+ 插件,您必须将 each 更改为 all,如下所示:

android.buildVariants.all  variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false

【讨论】:

以上是关于在 Android Gradle 构建中禁用清单合并的主要内容,如果未能解决你的问题,请参考以下文章

构建android gradle项目时如何禁用proguard生成dump.txt

Android清单文件合并的那些事

在 gradle android library kotlin 项目中禁用 META-INF/* 生成

Android Gradle 插件组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )

Android Gradle安卓应用构建流程 ( 资源文件编译 )

构建版本:清单中未找到版本代码