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
agrosner
źródło
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
czy dodałeś xmlns: tools = " schemas.android.com/tools " w tagu manifestu? tools.android.com/tech-docs/new-build-system/user-guide/...
TouchBoarder

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!

Andrus
źródło
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"/>
stefan K.
źródło
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.

Radość
źródł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.

Nantoka
źródło
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"**
        >
Yogamurthy
źródło
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">
partizan
źródło
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ć.

Saurabh Gaddelpalliwar
źródło
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,

Ismael ozil
źródło
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.

blueware
źródło
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
Shoaib Ahmed
źródło
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> 
Hoang Minh
źródło
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"
brybry
źródło
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">
Saeed Aliakbari
źródło
0
 tools:replace="android:supportsRtl,android:allowBackup,icon,label">
Android Studio
źródło