清单合并失败错误背景

我正在将我当前的项目大型应用程序迁移到Android Studio和Gradle中。我目前卡在以下问题上:

Error:(87, 9) Execution failed for task ':App:processDebugManifest'.
> Manifest merger failed : Attribute application@label value=(@string/app_label) from AndroidManifest.xml:87:9
    is also present at ANDROID_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)
    Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:82:5 to override

我尝试将以下属性添加到主文件中:AndroidManifest.xml

tools:replace="android:label, *App Name*"
tools:replace="android:label, @string/app_label"
tools:replace="android:label"

这些属性定义都不起作用。我做错了什么?


答案 1

试一试:

将其添加到<manifest/>

xmlns:tools="http://schemas.android.com/tools"

将其添加到<application/>

tools:node="replace"

基于,它应该覆盖所有元素。“将较低优先级的声明替换为带批注的声明。


答案 2

背景

合并清单文件时,存在与属性冲突的情况。label

通常,有三种类型的清单文件需要合并到单个生成的应用程序清单中,此处按优先级顺序排列:

  1. 产品变种和生成类型特定的清单文件。
  2. 应用程序的主清单文件。
  3. 库清单文件。

决议

冲突可以通过以下两种方式之一解决:-

删除冲突的标签

从库(或较低级别)清单文件中删除冲突的属性。

在本例中,定义了一个与主应用程序中的值不同的值。因此,如果不需要它,请将其删除 - 只需从库文件的文件中删除即可。ANDROID_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)@string/app_nameandroid:label="@string/app_name"AndroidManifest.xml

添加属性以允许自动解决冲突

有几个特殊的属性标记(在 tools 命名空间中)可用于表示有关如何解决冲突的特定决策。

在这种情况下,若要显式使主应用覆盖任何其他(例如库文件)应用程序标签,请将定义添加到节点和节点。android:labelxmlns:tools="http://schemas.android.com/tools"<manifest>tools:replace="label"<application>

下面是一个示例 - 在主应用程序的文件中使用它:AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:label="@string/app_name"
        tools:replace="label"/>
</manifest>

这种方法也适用于任何其他冲突的属性;例如,如果属性也存在冲突,则可以将其更改为 。icontools:replace="label, icon"


推荐