Herramientas: reemplazar no reemplazar en el manifiesto de Android

Estoy utilizando un proyecto de gradle con muchas dependencias de biblioteca diferentes y el uso de la nueva fusión de manifiesto. En mi etiqueta lo tengo configurado como tal:

  ....  

Sin embargo, estoy recibiendo el error:

 /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  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  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  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  element at AndroidManifest.xml:26:5 to override 

Declara tu encabezado de manifiesto como este

  

Luego agregue a su etiqueta de aplicación el siguiente atributo:

  

Por ejemplo, necesito reemplazar el icono y la etiqueta. ¡Buena suerte!

Intente reordenar sus dependencias en su archivo gradle. Tuve que mover la biblioteca infractora de la parte inferior de la lista a la parte superior, y luego funcionó.

Solucioné el mismo problema. Solución para mí:

  1. agregue la línea xmlns:tools="http://schemas.android.com/tools" en la etiqueta de manifiesto
  2. agregar tools:replace=.. en la etiqueta de manifiesto
  3. move android:label=... en la etiqueta de manifiesto

Ejemplo:

  < ?xml version="1.0" encoding="utf-8"?>  

Acabo de experimentar el mismo comportamiento de las tools:replace=... según lo describe el OP.

Resultó que la causa raíz de las tools:replace ser ignorado por la fusión de manifiesto es un error que se describe aquí . Básicamente significa que si tiene una biblioteca en su proyecto que contiene un manifiesto con un nodo que contiene un atributo tools:ignore=... , puede suceder que el atributo tools:replace=... en el manifiesto de su módulo principal será ignorado.

El punto difícil aquí es que puede suceder, pero no tiene que ser así. En mi caso, tenía dos bibliotecas, la biblioteca A con las tools:ignore=... atributo, la biblioteca B con los atributos a reemplazar en los manifiestos respectivos y las tools:replace=... atributo en el manifiesto del módulo principal . Si el manifiesto de B se fusionó en el manifiesto principal antes del manifiesto de A, todo funcionó como se esperaba. En orden de fusión opuesto apareció el error.

El orden en que ocurren estas fusiones parece ser algo aleatorio. En mi caso, cambiar el orden en la sección de dependencias de build.gradle no tuvo ningún efecto, pero cambió el nombre del sabor.

Por lo tanto, la única solución confiable parece ser descomprimir el problema que causa la biblioteca, eliminar las tools:ignore=... etiqueta (que no debería ser un problema, ya que es una pista para pelusa solamente) y empacar la biblioteca de nuevo.

Y vote para que se solucione el error, de la causa.

Solución de trabajo final para mí (resaltados los ítems en el código de muestra):

  1. agregue la línea xmlns:tools en la etiqueta de manifiesto
  2. agregar tools:replace en la etiqueta de la aplicación

Ejemplo:

 < ?xml version="1.0" encoding="utf-8"?>      

Puede reemplazarlos en su etiqueta de application Manifiesto:

  

y trabajará para ti.

Explicación

El uso de dicha dependencia / biblioteca en su archivo gradle que tiene esas tags en la etiqueta de la aplicación del Manifiesto puede producir este problema y reemplazarlas en su Manifest es la solución.

La pieza que faltaba para mí era esta:

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

por ejemplo:

  

FIJO QUE TENÍA EL ERROR EXACTO, solo agrega estas herramientas: replace = “android: icon, android: theme”

en su etiqueta de aplicación en su manifiesto, funciona bien,

Puede reemplazarlos en su etiqueta de aplicación Manifiesto:

  

y trabajará para ti.

Recibí un error similar en un proyecto que estaba importando:

Varias entradas con la misma clave: android: icon = REPLACE y herramientas: icon = REPLACE

Solucionado después de cambiar la línea a continuación dentro de la etiqueta de la aplicación:

 tools:replace="icon, label, theme" 

a

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