android-gradle merge - Ferramentas:substituir e não substituir no manifesto do Android




found de (11)

Eu estou usando um projeto gradle com muitas dependências de bibliotecas diferentes e usando a nova fusão de manifesto. Na minha tag <application /> eu configuro como tal:

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

Ainda estou recebendo o erro:

/android/MyApp/app/src/main/AndroidManifest.xml:29:9        Error:
Attribute [email protected] 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 [email protected] 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 [email protected] 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 [email protected] 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

Answers

O seguinte hack funciona:

  1. adicione a linha xmlns:tools="http://schemas.android.com/tools" na tag do manifesto
  2. adicionar tools:replace="android:icon,android:theme,android:allowBackup,label" na tag do aplicativo

Eu estava recebendo um erro semelhante em um projeto que estava importando:

Múltiplas entradas com a mesma chave: android: icon = REPLACE e ferramentas: icon = REPLACE

Corrigido após alterar a linha abaixo na tag do aplicativo:

tools:replace="icon, label, theme"

para

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

Eu consertei o mesmo problema. Solução para mim:

  1. adicione a linha xmlns:tools="http://schemas.android.com/tools" na tag do manifesto
  2. adicione tools:replace=.. na tag de manifesto
  3. mova android:label=... na tag do manifesto

Exemplo:

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

Tente reordenar suas dependências em seu arquivo gradle. Eu tive que mover a biblioteca ofensiva da parte inferior da lista para o topo, e então funcionou.


Solução de trabalho final para mim (destaque os dados no código de exemplo):

  1. adicione a linha xmlns:tools na tag de manifesto
  2. adicionar tools:replace na tag do aplicativo

Exemplo:

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

A peça que faltava para mim era esta:

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

por exemplo:

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

Você pode substituir aqueles na sua tag de aplicativo de manifesto:

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

e vai trabalhar para você.


Eu também passei por este problema e mudei isso:

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

para

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

Acabei de experimentar o mesmo comportamento das tools:replace=... conforme descrito pelo OP.

Descobriu-se que a causa raiz das tools:replace ser ignorada pela fusão manifesta é um erro descrito here . Basicamente, significa que se você tiver uma biblioteca em seu projeto que contenha um manifesto com um nó <application ...> contendo um atributo tools:ignore=... , pode acontecer que o atributo tools:replace=... o manifesto do seu módulo principal será ignorado.

O ponto complicado aqui é que isso pode acontecer, mas não é necessário. No meu caso eu tinha duas bibliotecas, biblioteca A com as tools:ignore=... atributo, biblioteca B com os atributos a serem substituídos nos respectivos manifestos e as tools:replace=... atributo no manifesto do módulo principal . Se o manifesto de B fosse fundido no manifesto principal antes do manifesto de A, tudo funcionaria como esperado. Na ordem de mesclagem oposta, o erro apareceu.

A ordem em que essas mesclagens acontecem parece ser um pouco aleatória. No meu caso, alterar a ordem na seção de dependências do build.gradle não teve efeito, mas a alteração do nome do sabor fez isso.

Portanto, a única solução confiável parece ser descompactar a biblioteca que causa o problema, remover as tools:ignore=... tag (que não deve ser problema, pois é apenas uma dica para lint) e empacote a biblioteca novamente.

E vote no bug a ser corrigido, de causa.


Declare o seu cabeçalho de manifesto como este

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

Em seguida, você pode adicionar ao seu aplicativo o seguinte atributo:

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

Por exemplo, eu preciso substituir o ícone e o rótulo. Boa sorte!


Eu notei que o emulador começa muito mais rápido se não houver um Dalvik Debug Monitor Server (DDMS) conectado. Portanto, se você iniciar o emulador a partir do Gerenciador de Dispositivos Virtual "SDK Setup.exe" e o Eclipse não for iniciado, o emulador funcionará mais rápido.

Se você iniciar o emulador a partir do Eclipse: O DDMS estará lá, então, às vezes, o emulador é extremamente lento, mas às vezes é mais rápido.







android android-gradle