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


147

我正在使用具有许多不同库依赖项的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

1
请参阅Meta中有关删除和重新发布问题的帖子:meta.stackoverflow.com/questions/265233/…。这样做一次不会对您造成特别的伤害,但是定期进行此操作并没有好处。
Scott Barta 2014年

1
我猜项目中有<application>重复的标签。请确保只有一个<application>
Panther

一个项目中可以有许多<application>标记,尤其是在使用任意数量的库子模块的情况下。
agrosner 2014年

我有一些例子可以很好地解决这个问题。您正在使用哪个版本的Android构建工具?
G. Blake Meike

您是否在清单标记中添加了xmlns:tools =“ schemas.android.com/tools ”?tools.android.com/tech-docs/new-build-system/user-guide/...
TouchBoarder

Answers:


233

这样声明清单标题

<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
您如何处理带有元数据的android:name?android:name =“ com.orm.SugarApp”> <元数据android:name =“数据库” android:value =“ sv_logs.db” /> <元数据android:name =“版本” android:value =“ 3“ /> <元数据android:name =” QUERY_LOG“ android:value =” true“ /> <元数据android:name =” DOMAIN_PACKAGE_NAME“ android:value =” com.example.app“ />
艾伦

@Alan只需用更换整个元数据标签tools:node="replace"<meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />
黑光

25
我很困惑。那不是他在做什么吗?
杰森·罗宾逊

我添加tools:replace了应该替换它的应用程序标签,而不是应该替换的源。因此,我的应用清单替换了我的库中定义的内容。您说的是“应替换的内容”,而不是“可以替换的内容”。我希望可以解决这些问题。
WarrenFaith 2015年

1
如果replaced属性在manifest标签中,则tools:replace="android:versionCode, android:versionName"必须在inside <manifest >标签中。
Ivan Chau

42

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

  1. 添加 xmlns:tools="http://schemas.android.com/tools"在清单标签中行
  2. 添加tools:replace=..清单标签
  3. android:label=...在清单标签中移动

例:

 <?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"/>

1
为此,唯一可以解决此问题的方法是<manifest>直接添加而不是在下面添加<application>
A. Sokol

1
我没有为我工作,我应该把tools:replace =“ android:allowBackup,android:label”或仅仅是tools:replace =“ allowBackup,label”。
jmarkstar

1
您确定这有效吗?因为对我来说,好像您在错误的地方写了allowBackup,并且合并之后,库在清单上指定的内容占了上风。将其移到最上面后,您不会有冲突,因为您做错了(developer.android.com/guide/topics/manifest/…)AllowBackup属于Application元素。
Reinherd

2
[...从上面继续]不起作用。您在错误的位置写了allowBackup,并且合并后,库在清单上指定的内容占了上风。将其移到最上面后,您不会有冲突,因为您做错了(developer.android.com/guide/topics/manifest/…)AllowBackup属于Application元素。我已经通过反编译APK对其进行了测试,并且最终清单的值为TRUE,而不是我按照您建议的指定为FALSE
Reinherd

38

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


请告诉我一件事工具:替换是否应在项目清单的应用程序标记内或库的应用程序标记内添加此代码,请告诉我这对我真的很有帮助?
Sudhanshu Gaur 2015年

@SudhanshuGaur您只需要将其添加到项目的AndroidManifest.xml文件即可。
刘凯(Kyle Liu)

74
有效。但是这样的解决方案可能会使人类失去信心。
Vinay Patil

8
#android这样的陷阱使开发android非常烦人
Taylor Halliday

1
如果您有多种产品风格,例如播放和非播放,并且相关性是“ playReleaseCompile ______”,则仅将语句移至顶部可能不起作用,您可能必须将语句更改为“ compile ______”,然后将其移至最佳。那应该可以了。
苏厄姆

33

我刚刚遇到tools:replace=...了OP描述的相同行为。

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

这里的棘手点是它可以发生,但不是必须的。在我的情况下,我有两个库,一个具有tools:ignore=...属性的库A,一个具有在相应清单中要替换的tools:replace=...属性和在主模块的清单中的属性的库B。如果B的清单在A的清单之前被合并到主清单中,则一切按预期进行。以相反的合并顺序出现错误。

这些合并发生的顺序似乎有些随机。在我的情况下,更改的“依赖关系”部分中的顺序build.gradle没有任何效果,但更改风味的名称即可。

因此,唯一可靠的解决方法似乎是解压缩导致库的问题,删除tools:ignore=...标签(这应该没问题,因为这仅是皮棉的提示),然后再次打包库。

并为要修复的错误投票,是有原因的。


就我而言,我必须删除tools:ignore从我的项目中,而不是从一个库中忽略
mohax

3
这也是我的问题。将tools:ignore <manifest><application>节点移到该节点,它开始起作用。
雅各布·塔巴克

刚刚遇到过与Bazel v2.0.0
Nick Korostelev

18

对我来说,最终的解决方案(在示例代码中突出显示了标记):

  1. xmlns:tools在清单标签中添加行
  2. 添加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"**
        >

13

我缺少的部分是:

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">

您可以完全共享您在<manifest ...>中的代码吗?
partizan

8

您可以在清单应用程序标签中替换那些标签:

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

会为您工作。


由于某种原因,它不起作用。...我尝试添加tools:replace="android:label"到应用程序中,但不起作用
iKK

4

解决它 确切的错误,只需添加此工具:replace =“ android:icon,android:theme”

放入清单中的application标记中,效果很好,


这是正常的事情。当添加了tools:replace时,在某些情况下发生的话题不是正常行为。
大卫,

4

您可以替换清单application标签中的标签:

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

会为您工作。

说明

在您的gradle文件中使用这样的依赖项/库(在清单文件的application标签中带有那些标签)可能会产生此问题,而在您Manifest的解决方案中替换它们。



1

我的问题是带有基本模块,应用程序模块和功能模块的多模块项目。每个模块都有自己的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> 

0

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

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

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

tools:replace="icon, label, theme"

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

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">

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.