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

17
我正在使用新的Gradle Android构建系统。
该项目由两个Android库项目和一个主项目组成。
在使用ant构建时,必须在project.properties中启用清单合并器。但是,在使用Gradle构建系统时,默认情况下启用了清单合并器。我怎样才能禁用清单合并器?

我很想知道你为什么想要禁用它?我们目前没有计划启用它,但我们希望支持所有的使用情况。 - Xavier Ducrohet
@Xav:我们目前使用ant构建了我们的项目,并没有关注我们库项目中的AndroidManifest.xml。因此,在迁移到gradle时,由于清单合并错误,我们遇到了一些小问题。 - endian
1
@Xav:我也希望能够禁用合并。清单合并似乎优先考虑主要清单。我在我的风味中有一些值,例如“图标”,需要覆盖主要清单,但合并器正在丢弃这些值。 - Douglas Ferguson
1
@DouglasFerguson 你是指android:icon属性吗?为什么不直接在这个flavor的资源文件夹里覆盖掉图标本身呢? - Xavier Ducrohet
@XavierDucrohet 我也遇到了同样的问题,但我只需要在发布产品风格中的Android清单元素中添加一个额外的属性android:sharedUserId。我该怎么做? - Kevin Tan
5个回答

10

编辑:实际上这是可能的,尽管是间接的,从0.3版本开始。

你需要做的是禁用processManifest任务,使其不运行,并告诉processResources使用哪个清单文件:

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

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


3
当我尝试这样做时,出现了“在com.android.build.gradle.AppExtension_Decorated@57eaaca上找不到'buildVariants'属性”的错误。 - Dylan
3
+1 这不再适用于 0.5+ 插件,并且文档无法帮助理解如何排除某些库的清单。 - Oleksii Malovanyi

8
这可能会有所帮助。
 android.applicationVariants.all{ variant ->
       variant.outputs.each { output ->
         output.processResources.manifestFile = file('AndroidManifest.xml')
         output.processManifest.enabled=false
       }
  }

它可以与2.10插件一起使用。 清单文件路径应为'src/main/AndroidManifest.xml'。 - Ryan Amaral

5
对于 0.6.+ 插件,您还需要从 buildVariants 更改为 applicationVariants:
android.applicationVariants.all { variant ->
    variant.processResources.manifestFile = file('src/main/AndroidManifest.xml')
    variant.processManifest.enabled=false
}

需要在哪个文件中进行这个更改? - Shajeel Afzal
2
通过将以下内容粘贴到应用程序的build.gradle中,我遇到了错误:Error:(92, 0) Could not find property 'processResources' on com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@68ff5866。 <a href="openFile:/Users/shajeel1/Documents/Android_Studio_Workspace/Cricket_Scorer_Application/app/build.gradle">打开文件</a> - Shajeel Afzal

3

看起来这些解决方案不适用于1.0插件:

在com.android.build.gradle.internal.api.ApplicationVariantImpl_Decorated@774f1d0b上找不到属性'processResources'。

有人有更新吗?我们的问题是来自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文件中包含了“读取联系人”权限,但我在清单文件中没有声明它。不确定如何解决这个问题。 - Shajeel Afzal
@ShajeelAfzal 请检查 build/outputs/logs/manifest-merger-debug-report.txt 文件,以查看 build/intermediates/manifests/full/debug/AndroidManifest.xml 中的每个位是从哪里来的。(在旧版本中可能不可用或在不同文件中;我正在使用2.0.0版本。) - TWiStErRob

2

对于0.5.+插件,您需要像这样从each更改为all

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接