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

agr*_*ner 135 android android-gradle-plugin

我正在使用具有许多不同库依赖项的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>
Run Code Online (Sandbox Code Playgroud)

然而,我收到错误:

/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
Run Code Online (Sandbox Code Playgroud)

小智 210

像这样声明你的清单标题

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yourpackage"
    xmlns:tools="http://schemas.android.com/tools">
Run Code Online (Sandbox Code Playgroud)

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

<application
    tools:replace="icon, label" ../>
Run Code Online (Sandbox Code Playgroud)

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

  • 我糊涂了.这不正是他在他的问题中所做的事情吗? (24认同)

小智 40

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

  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"/>
Run Code Online (Sandbox Code Playgroud)

  • 我没有为我工作,我应该放置 tools:replace="android:allowBackup, android:label" 也不只是 tools:replace="allowBackup, label"。 (2认同)
  • 你确定这有效吗?因为对我来说,看起来你在错误的地方写了 allowBackup ,合并后,图书馆在他的清单上指定的内容占上风。将其移至顶部后您没有冲突,因为您只是做错了(https://developer.android.com/guide/topics/manifest/application-element.html) AllowBackup 属于 Application 元素。 (2认同)
  • [......从上面继续]这不起作用.您正在将allowBackup写入错误的位置,并且在合并之后,库在其清单上指定了什么.将它移到最顶层后没有冲突,因为你做错了(https://developer.android.com/guide/topics/manifest/application-element.html)AllowBackup属于Application元素.我通过反编译APK测试了它,最终清单的值为TRUE而不是FALSE,正如我建议的那样你建议的 (2认同)

GLe*_*Lee 38

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

  • 有效.但是这样的解决方案可能会摒弃人类的信仰. (71认同)
  • #android陷阱就像这些让Android开发很烦人 (8认同)

Nan*_*oka 32

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

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

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

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

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

并且投票支持修复错误的原因.

  • 这也是我的问题.移动工具:忽略来自`<application>`节点的`<manifest>`节点,它工作正常. (2认同)

Yog*_*thy 18

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

  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"**
        >
Run Code Online (Sandbox Code Playgroud)


小智 13

对我来说遗失的是:

xmlns:tools="http://schemas.android.com/tools"
Run Code Online (Sandbox Code Playgroud)

例如:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
    package="com.your.appid">
Run Code Online (Sandbox Code Playgroud)


Sau*_*war 8

您可以替换Manifest应用程序标记中的那些:

<application
    tools:replace="android:icon, android:label, android:theme, android:name,android:allowBackup"
android:allowBackup="false"...>
Run Code Online (Sandbox Code Playgroud)

并将为你工作.

  • 由于某种原因它不起作用......我尝试将 `tools:replace="android:label"` 添加到应用程序,但它不起作用 (2认同)

Sho*_*med 7

以下黑客工作原理:

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


小智 5

 tools:replace="android:supportsRtl,android:allowBackup,icon,label">
Run Code Online (Sandbox Code Playgroud)