Narzędzia: zamień nie zastępuj w manifeście Androida


147

Używam projektu gradle z wieloma różnymi zależnościami bibliotek i używam nowego połączenia manifestów. W moim <application />tagu mam to skonfigurowane jako takie:

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

Jednak otrzymuję błąd:

/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
Zobacz ten post w Meta dotyczący usuwania i ponownego wysyłania pytań: meta.stackoverflow.com/questions/265233/… . Zrobienie tego raz nie zaszkodzi ci szczególnie, ale nie byłoby dobrze robić tego regularnie.
Scott Barta,

1
Wydaje mi się, że <application>w projekcie jest powtórzony tag. Pls upewnij się, że jest tylko jeden <application>.
Panther

W projekcie może znajdować się wiele tagów <application>, zwłaszcza jeśli używasz dowolnej liczby modułów podrzędnych biblioteki.
agrosner

Mam przykłady przypadków, w których to działa dobrze. Jakiej wersji narzędzi do kompilacji systemu Android używasz?
G. Blake Meike

Odpowiedzi:


233

Zadeklaruj swój nagłówek manifestu w ten sposób

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

Następnie możesz dodać do tagu aplikacji następujący atrybut:

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

Na przykład muszę wymienić ikonę i etykietę. Powodzenia!


1
jak radzisz sobie z android: name z metadanymi? android: name = "com.orm.SugarApp"> <metadane android: name = "DATABASE" android: value = "sv_logs.db" /> <metadane android: name = "VERSION" android: value = " 3 "/> <metadane android: name =" QUERY_LOG "android: value =" true "/> <metadane android: name =" DOMAIN_PACKAGE_NAME "android: value =" com.example.app "/>
Alan

@Alan Po prostu zamień cały tag metadanych na tools:node="replace": <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />itd.
Blacklight

25
Jestem zmieszany. Czy to nie jest dokładnie to, co robi w swoim pytaniu?
Jason Robinson

Dodałem tools:replacedo mojej aplikacji tag, który powinien go zastąpić, a nie źródło, które powinno zostać zastąpione. Więc manifesty mojej aplikacji zastępują to, co jest zdefiniowane w mojej bibliotece. Mówisz „co należy zastąpić” zamiast „co można zastąpić”. Mam nadzieję, że to wyjaśnia pytania.
WarrenFaith

1
Jeśli zastąpiony atrybut znajduje się w tagu manifestu, tools:replace="android:versionCode, android:versionName"musi znajdować się wewnątrz <manifest >tagu.
Ivan Chau

42

Naprawiłem ten sam problem. Rozwiązanie dla mnie:

  1. dodaj xmlns:tools="http://schemas.android.com/tools"wiersz w tagu manifestu
  2. dodaj tools:replace=..w tagu manifestu
  3. przenieść android:label=...w tagu manifestu

Przykład:

 <?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
Dzięki za to, dodanie go <manifest>bezpośrednio zamiast pod <application>było jedyną rzeczą, która rozwiązała mój problem.
A. Sokol

1
Nie pracowałem dla mnie, powinienem umieścić narzędzia: replace = "android: allowBackup, android: label" ani tylko narzędzia: replace = "allowBackup, label".
jmarkstar

1
Czy na pewno to działa? Ponieważ dla mnie wygląda na to, że piszesz plik allowBackup w niewłaściwym miejscu i że po scaleniu obowiązuje to, co Biblioteka określiła w swoim manifeście. Nie masz konfliktu po przeniesieniu go na górę, ponieważ robisz to źle ( developer.android.com/guide/topics/manifest/ ... ) AllowBackup należy do elementu Application.
Reinherd

2
[... kontynuuje z góry] TO NIE DZIAŁA. Piszesz allowBackup w złym miejscu i że po scaleniu obowiązuje to, co Biblioteka określiła w swoim manifeście. Nie masz konfliktu po przeniesieniu go na górę, ponieważ robisz to źle ( developer.android.com/guide/topics/manifest/ ... ) AllowBackup należy do elementu Application. Przetestowałem to, dekompilując plik APK, a ostateczny manifest miał wartość TRUE zamiast FALSE, jak
wskazałem,

38

Spróbuj zmienić kolejność zależności w pliku gradle. Musiałem przenieść naruszającą bibliotekę z dołu listy na górę i wtedy zadziałało.


proszę powiedz mi jedno narzędzia: wymień, czy powinienem dodać ten znacznik aplikacji w manifeście mojego projektu lub w tagu aplikacji w mojej bibliotece, proszę, powiedz, że będzie to dla mnie naprawdę pomocne?
Sudhanshu Gaur

@SudhanshuGaur Wystarczy dodać go do pliku AndroidManifest.xml swojego projektu.
Kyle Liu

74
Zadziałało. Ale takie rozwiązania mogą odebrać ludzkości wiarę.
Vinay Patil

8
Takie #androidowe kłopoty sprawiają, że tworzenie aplikacji dla Androida jest dość irytujące
Taylor Halliday

1
Jeśli masz wiele smaków produktu, takich jak play i non play, a zależnością jest „playReleaseCompile ______”, samo przeniesienie instrukcji na górę może nie zadziałać, może być konieczna zmiana instrukcji na „compile ______”, a następnie przeniesienie do Top. Wtedy powinno działać.
Soham,

33

Po prostu doświadczyłem tego samego zachowania, tools:replace=...które opisał OP.

Okazało się, że główną przyczyną tools:replaceignorowania przez manifestowe połączenie jest opisany tutaj błąd . Zasadniczo oznacza to, że jeśli masz bibliotekę w swoim projekcie, która zawiera manifest z <application ...>węzłem zawierającym tools:ignore=...atrybut, może się zdarzyć, że tools:replace=...atrybut w manifeście twojego modułu głównego zostanie zignorowany.

Problem w tym, że może się to zdarzyć, ale nie musi. W moim przypadku miałem dwie biblioteki, bibliotekę A z tools:ignore=...atrybutem, bibliotekę B z atrybutami do zastąpienia w odpowiednich manifestach oraz tools:replace=...atrybut w manifeście modułu głównego. Jeśli manifest B został połączony z głównym manifestem przed manifestem A, wszystko działało zgodnie z oczekiwaniami. W odwrotnej kolejności scalania pojawił się błąd.

Kolejność, w jakiej zachodzą te połączenia, wydaje się nieco przypadkowa. W moim przypadku zmiana kolejności w sekcji zależności build.gradlenie przyniosła skutku, ale zmiana nazwy smaku zrobiła to.

Tak więc jedynym niezawodnym obejściem wydaje się być rozpakowanie problemu powodującego bibliotekę, usunięcie tools:ignore=...tagu (co nie powinno stanowić problemu, ponieważ jest to wskazówka tylko dla kłaczków) i ponownie spakuj bibliotekę.

I zagłosuj na naprawienie błędu, przyczyny.


W moim przypadku musiałem usunąć narzędzia: ignoruj ​​z mojego projektu, nie z jednej z bibliotek
mohax

3
To też był mój problem. Przeniesiono narzędzia: ignoruj ​​do <manifest>węzła z <application>węzła i zadziałało.
Jacob Tabak,

Właśnie napotkałem ten sam problem z Bazel v2.0.0, zgłosił błąd tutaj github.com/bazelbuild/bazel/issues/10543
Nick Korostelev

18

Ostateczne rozwiązanie robocze dla mnie (wyróżniono tagi w przykładowym kodzie):

  1. dodaj xmlns:toolswiersz w tagu manifestu
  2. dodaj tools:replacetag aplikacji

Przykład:

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

Brakowało mi tego:

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

na przykład:

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

Czy możesz udostępnić swój kod dokładnie tak, jak masz go w <manifestie ...>?
partizan

8

Możesz zastąpić te w tagu aplikacji Manifest:

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

i będzie dla Ciebie pracować.


Z jakiegoś powodu nie działa .... Próbuję dodać tools:replace="android:label"do aplikacji, ale nie działa
iKK

4

NAPRAWIONO BYŁ DOKŁADNY BŁĄD. Po prostu dodaj to narzędzie: replace = "android: icon, android: theme"

do tagu aplikacji w manifeście, działa dobrze,


to normalna rzecz. to, o czym jest temat, nie jest normalnym zachowaniem, zdarza się w niektórych przypadkach, gdy dodano nawet narzędzia: zamień.
David

4

Możesz zastąpić te w swoim applicationtagu Manifest :

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

i będzie dla Ciebie pracować.

Wyjaśnienie

Użycie takiej zależności / biblioteki w gradlepliku, która ma te etykiety w tagu aplikacji swojego manifestu, może spowodować ten problem i zastąpienie ich w twoim Manifestjest rozwiązaniem.


1

Następujący hack działa:

  1. dodaj xmlns:tools="http://schemas.android.com/tools"wiersz w tagu manifestu
  2. dodaj tools:replace="android:icon,android:theme,android:allowBackup,label" tag aplikacji

1

Moim problemem jest projekt z wieloma modułami z modułem podstawowym, modułem aplikacji i modułem funkcji. Każdy moduł ma własny AndroidManifest i zaimplementowałem wariant kompilacji dla debugowania i main. Musimy więc upewnić się, że „android: name” właśnie zadeklarował w Manifeście tylko debug i main, i nie ustawiaj go w żadnym z Manifestów w module potomnym. Np .: Manifest w głównej:

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

Manifest w debugowaniu:

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

Nie ustawiaj „android: name” w innych plikach manifestu, takich jak ten:

<application android:name=".App">

Po prostu zdefiniuj w module funkcji w ten sposób i zostanie dobrze scalony

<application> 

0

Otrzymałem podobny błąd w projekcie, który importowałem:

Wiele wpisów z tym samym kluczem: android: ikona = WYMIANA i narzędzia: ikona = WYMIANA

Naprawiono po zmianie poniższej linii w tagu aplikacji:

tools:replace="icon, label, theme"

do

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

0

Przeszedłem też przez ten problem i zmieniłem, że:

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

do

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.