在 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
在 gradle android library kotlin 项目中禁用 META-INF/* 生成
Android Gradle 插件组件化中的 Gradle 构建脚本实现 ④ ( 使用路由实现组件间通信 | 引入 ARoute 框架 | Gradle 构建脚本优化问题 )