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
android
android-gradle-plugin
agrosner
źródło
źródło
<application>
w projekcie jest powtórzony tag. Pls upewnij się, że jest tylko jeden<application>
.Odpowiedzi:
Zadeklaruj swój nagłówek manifestu w ten sposób
Następnie możesz dodać do tagu aplikacji następujący atrybut:
Na przykład muszę wymienić ikonę i etykietę. Powodzenia!
źródło
tools:node="replace"
:<meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />
itd.tools:replace
do 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.tools:replace="android:versionCode, android:versionName"
musi znajdować się wewnątrz<manifest >
tagu.Naprawiłem ten sam problem. Rozwiązanie dla mnie:
xmlns:tools="http://schemas.android.com/tools"
wiersz w tagu manifestutools:replace=..
w tagu manifestuandroid:label=...
w tagu manifestuPrzykład:
źródło
<manifest>
bezpośrednio zamiast pod<application>
było jedyną rzeczą, która rozwiązała mój problem.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.
źródło
Po prostu doświadczyłem tego samego zachowania,
tools:replace=...
które opisał OP.Okazało się, że główną przyczyną
tools:replace
ignorowania 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ącymtools:ignore=...
atrybut, może się zdarzyć, żetools: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 oraztools: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.gradle
nie 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.
źródło
<manifest>
węzła z<application>
węzła i zadziałało.Ostateczne rozwiązanie robocze dla mnie (wyróżniono tagi w przykładowym kodzie):
xmlns:tools
wiersz w tagu manifestutools:replace
tag aplikacjiPrzykład:
źródło
Brakowało mi tego:
na przykład:
źródło
Możesz zastąpić te w tagu aplikacji Manifest:
i będzie dla Ciebie pracować.
źródło
tools:replace="android:label"
do aplikacji, ale nie działaNAPRAWIONO 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,
źródło
Możesz zastąpić te w swoim
application
tagu Manifest :i będzie dla Ciebie pracować.
Wyjaśnienie
Użycie takiej zależności / biblioteki w
gradle
pliku, która ma te etykiety w tagu aplikacji swojego manifestu, może spowodować ten problem i zastąpienie ich w twoimManifest
jest rozwiązaniem.źródło
Następujący hack działa:
xmlns:tools="http://schemas.android.com/tools"
wiersz w tagu manifestutools:replace="android:icon,android:theme,android:allowBackup,label"
tag aplikacjiźródło
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:
Manifest w debugowaniu:
Nie ustawiaj „android: name” w innych plikach manifestu, takich jak ten:
Po prostu zdefiniuj w module funkcji w ten sposób i zostanie dobrze scalony
źródło
Otrzymałem podobny błąd w projekcie, który importowałem:
Naprawiono po zmianie poniższej linii w tagu aplikacji:
do
źródło
Przeszedłem też przez ten problem i zmieniłem, że:
do
źródło
źródło