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

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

像这样声明清单标题

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

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

尝试在 gradle 文件中重新排序您的依赖项。我不得不把这个讨厌的图书馆从列表的底部移到了顶部,然后它起作用了。

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

结果表明,清单合并忽略 tools:replace的根本原因是一个描述为 给你的错误。这基本上意味着,如果您的项目中有一个库,其中包含一个包含 tools:ignore=...属性的 <application ...>节点的清单,那么可能会忽略主模块清单中的 tools:replace=...属性。

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

这些合并发生的顺序似乎有些随机。在我的例子中,更改 build.gradle的依赖项部分中的顺序没有任何效果,但更改风味的名称就有效果。

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

当然,投票赞成修复漏洞。

有精确的错误,只需添加这个工具:

进入你的 申请标签在你的清单, 效果很好,

为我准备的最终工作解决方案(突出显示示例代码中的标记) :

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

您可以替换您的舱单 application标记中的那些:

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

为你工作。

解释

gradle文件中使用这样的依赖项/库(它在 Manifest 的 application 标记中包含这些标签)可能会产生这个问题,而在 Manifest中替换这些标签就是解决方案。

我解决了同样的问题,我的解决办法是:

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

对我来说,缺失的是这样一个部分:

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

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

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

修正了在应用程序标签中改变下面一行的问题:

tools:replace="icon, label, theme"

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

您可以替换 Manifest 应用程序标记中的内容:

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

为你工作。

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

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

以下黑客攻击方法奏效:

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

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

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

在调试中显示:

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

不要在其他 Manifest 文件中设置“ android: name”,如下所示:

<application android:name=".App">

像这样在特征模块中定义,就可以很好地合并

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

这是用于 flutter 的新 androidManifest.xml

<application
android:label="Your app Name"
tools:replace="android:label"
android:name="io.flutter.app.FlutterApplication"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
android:icon="@mipmap/ic_launcher">

请在 < application’的第一行添加 android: label,因为如果您使用这个包 flutter _ app _ name,如果没有像上面的例子那样排序,那么将抛出一个错误