清单合并失败错误

时间:2015-01-22 18:03:58

标签: java android android-studio gradle android-manifest

我正在将当前项目的大型应用程序迁移到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"

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

7 个答案:

答案 0 :(得分:137)

尝试一下:

将此添加到<manifest/>

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

将此添加到<application/>

tools:node="replace"

基于this,它应该覆盖所有元素。 &#34;用带注释的声明替换低优先级声明。&#34;

答案 1 :(得分:33)

背景

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

通常,there are three types清单文件需要合并到一个生成的应用清单中,按优先顺序排列:

  1. 产品风格和构建类型特定的清单文件。
  2. 应用程序的主清单文件。
  3. 图书馆清单文件。
  4. 分辨率

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

    删除冲突的标签

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

    在这种情况下,ANDROID_APPLICATION:Library:unspecified:9:18 value=(@string/app_name)定义的@string/app_name值与主应用程序中的值不同。因此,如果不需要,则将其删除 - 只需从库文件的android:label="@string/app_name"文件中删除AndroidManifest.xml

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

    several special attribute markers(在工具名称空间中)可用于表达如何解决冲突的具体决策。

    在这种情况下,要显式地使主应用程序的android:label覆盖任何其他(例如库文件)应用程序标签,请将xmlns:tools="http://schemas.android.com/tools"定义添加到<manifest>节点,并{{ 1}}到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> 属性也存在冲突,则可以将其更改为icon

答案 2 :(得分:4)

如果你像我一样幸运,你可以通过hacky解决方法手动解决问题。

AAR文件只是扩展名为.aar的.zip文件。在我的情况下,我解压缩了.aar,从图书馆的android:label中删除了有问题的AndroidManifest.xml,然后重新归档了.aar扩展名的剩余文件,所有内容似乎都与新的.aar。

仅供参考,this appears to be a known bug in the android gradle plugin

答案 3 :(得分:3)

我修复了同样的问题。我的解决方案:

  1. 在清单标记
  2. 中添加xmlns:tools="http://schemas.android.com/tools"
  3. 在清单标记
  4. 中添加tools:replace=..
  5. 在清单标记中移动android:label=...
  6. Example here

答案 4 :(得分:0)

我也面临同样的问题,经过大量研究后发现了灵魂

  
      
  1. 您的min sdk版本应与您使用的模块相同   例如:你的模块min sdk版本是14,你的app min sdk版本是9   应该是一样的。
  2.   
  3. 如果您的应用和模块的构建版本不相同。再次它应该相同
  4.   

简而言之,您的app build.gradle文件和清单应具有相同的配置

  
      
  1. 在清单文件中两次添加相同权限没有重复,相同的活动提及两次
  2.   
  3. 如果您删除了项目中的任何活动,请将其从清单文件中删除
  4.   
  5. 有时它是清单文件的标签,图标等标签   a)在清单标记中添加xmlns:tools行   b)在应用程序标记中添加工具:replace =或tools:ignore =   示例
  6.   
   <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.slinfy.ikharelimiteduk"
xmlns:tools="http://schemas.android.com/tools"
android:versionCode="1"
android:versionName="1.0" >
<application
    tools:replace="icon, label"
    android:label="myApp"
    android:name="com.example.MyApplication"
    android:allowBackup="true"
    android:hardwareAccelerated="false"
    android:icon="@drawable/ic_launcher"
    android:theme="@style/Theme.AppCompat" >
</application>
</manifest>

通过考虑这些要点,你将摆脱这个明显合并失败的问题 查看我的帖子:此问题是由于Manifest文件或build.gradle文件中的问题引起的。你可以查看我的帖子 https://wordpress.com/post/dhingrakimmi.wordpress.com/23

答案 5 :(得分:0)

我刚刚删除

android:label="@string/app_name

manifest file开始,它起作用了!

答案 6 :(得分:0)

我修改了清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example">

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
        <activity android:name=".SomeActivity"/>
    </application>
</manifest>

收件人

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true"
        tools:replace="android:label">
        <activity android:name=".SomeActivity"/>
    </application>
</manifest>

现在android:label被父应用程序中的标签所代替。