工具:在Android清单中替换不替换

时间:2014-09-22 18:50:28

标签: android android-gradle

我正在使用具有许多不同库依赖关系并使用新清单合并的gradle项目。在我的<application />代码中,我将其设置为:

<application tools:replace="android:icon, android:label, android:theme, android:name"
    android:name="com.example.myapp.MyApplcation"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/application_name"
    android:logo="@drawable/logo_ab"
    android:theme="@style/AppTheme"
    >
....
</application>

然而我收到了错误:

/android/MyApp/app/src/main/AndroidManifest.xml:29:9        Error:
Attribute application@icon value=(@drawable/ic_launcher) from AndroidManifest.xml:29:9
is also present at {Library Name} value=(@drawable/app_icon)
Suggestion: add 'tools:replace="android:icon"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:30:9 Error:
Attribute application@label value=(@string/application_name) from AndroidManifest.xml:30:9
is also present at {Library Name} value=(@string/app_name)
Suggestion: add 'tools:replace="android:label"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:27:9 Error:
Attribute application@name value=(com.example.myapp.MyApplication) from AndroidManifest.xml:27:9
is also present at {Another Library}

Suggestion: add 'tools:replace="android:name"' to <application> element at AndroidManifest.xml:26:5 to override

/android/MyApp/app/src/main/AndroidManifest.xml:32:9 Error:
Attribute application@theme value=(@style/AppTheme) from AndroidManifest.xml:32:9
is also present at {Library Name} value=(@style/AppTheme)
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:26:5 to override

14 个答案:

答案 0 :(得分:195)

像这样声明你的清单标题

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

然后,您可以在应用程序标记中添加以下属性:

<application
    tools:replace="icon, label" ../>

例如,我需要替换图标和标签。祝你好运!

答案 1 :(得分:38)

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

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

     <?xml version="1.0" encoding="utf-8"?>
        <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
                  tools:replace="allowBackup, label"
                  android:allowBackup="false"
                  android:label="@string/all_app_name"/>
    

答案 2 :(得分:36)

尝试重新排序gradle文件中的依赖项。我不得不将有问题的库从列表底部移到顶部,然后才能工作。

答案 3 :(得分:30)

我刚刚经历了与OP所描述的tools:replace=...相同的行为。

事实证明,清单合并忽略tools:replace的根本原因是here描述的错误。它基本上意味着如果项目中有一个包含<application ...>节点包含tools:ignore=...属性的清单的库,则可能会发生主要清单中的tools:replace=...属性模块将被忽略。

这里棘手的一点是可以发生,但不必。在我的例子中,我有两个库,库A具有tools:ignore=...属性,库B具有要在相应清单中替换的属性,以及主模块清单中的tools:replace=...属性。如果B的清单在A的清单之前合并到主清单中,那么一切都按预期工作。在相反的合并顺序中出现错误。

这些合并发生的顺序似乎有点随机。在我的情况下,更改build.gradle的依赖项部分中的顺序没有任何效果,但改变了味道的名称。

因此,唯一可靠的解决方法似乎是解压问题导致库,删除tools:ignore=...标记(这应该没有问题,因为它只是lint的提示)并再次打包库。

投票支持修复错误,原因。

答案 4 :(得分:17)

我的最终工作解决方案(突出显示示例代码中的tages):

  1. 在清单标记
  2. 中添加xmlns:tools
  3. 在应用标记
  4. 中添加tools:replace

    示例:

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="pagination.yoga.com.tamiltv"
        **xmlns:tools="http://schemas.android.com/tools"**
        >
    
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme"
            **tools:replace="android:icon,android:theme"**
            >
    

答案 5 :(得分:12)

对我来说遗失的是:

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

例如:

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

答案 6 :(得分:7)

您可以替换Manifest应用程序代码中的内容:

<application
    tools:replace="android:icon, android:label, android:theme, android:name,android:allowBackup"
android:allowBackup="false"...>

并且适合你。

答案 7 :(得分:4)

固定IT 有真正的错误,只需添加此工具:replace =“android:icon,android:theme”

进入清单中的应用标记, 它运作得很好,

答案 8 :(得分:4)

您可以替换Manifest application标记中的内容:

<application
    ...
    tools:replace="android:label, android:icon, android:theme"/>

并且适合你。

<强>解释

在您的gradle文件中使用此类依赖项/库,在其Manifest应用程序代码中包含这些标签可能会产生此问题,并在Manifest中替换它们是解决方案。

答案 9 :(得分:1)

 tools:replace="android:supportsRtl,android:allowBackup,icon,label">

答案 10 :(得分:0)

我在导入的项目中收到了类似的错误:

  

具有相同键的多个条目:android:icon = REPLACE和   工具:图标= REPLACE

在更改应用程序标记中的以下行后修复:

tools:replace="icon, label, theme"

tools:replace="android:icon, android:label, android:theme"

答案 11 :(得分:0)

我也经历了这个问题并改变了它:

<application  android:debuggable="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:supportsRtl="true" android:allowBackup="false" android:fullBackupOnly="false" android:theme="@style/UnityThemeSelector">

 <application tools:replace="android:allowBackup" android:debuggable="true" android:icon="@drawable/app_icon" android:label="@string/app_name" android:supportsRtl="true" android:allowBackup="false" android:fullBackupOnly="false" android:theme="@style/UnityThemeSelector">

答案 12 :(得分:0)

以下骇客作品:

  1. xmlns:tools="http://schemas.android.com/tools"行添加到     清单标签
  2. 添加     tools:replace="android:icon,android:theme,android:allowBackup,label"     在应用程序标签中

答案 13 :(得分:0)

我的问题是带有基本模块,应用程序模块和功能模块的多模块项目。 每个模块都有自己的AndroidManifest,我为debug和main实现了构建变体。 因此,我们必须确保仅在debug清单和main清单中声明了“ android:name”,并且不要在子模块的Manifest清单中进行设置。 例如: 主要清单:

 <application
        android:name=".App"/>

调试清单:

<application
        tools:replace="android:name"
        android:name=".DebugApp"
        />

请勿在其他清单文件中设置“ android:name”:

<application android:name=".App">

只需在这样的功能模块中定义,它就会很好地合并

<application>