Инструменты: заменить не заменить в манифесте Android


147

Я использую проект gradle с множеством различных библиотечных зависимостей и использую новый манифест слияния. В моем <application />теге он настроен так:

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

Тем не менее я получаю сообщение об ошибке:

/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
См. Этот пост в Meta об удалении и повторной публикации вопросов: meta.stackoverflow.com/questions/265233/… . Если вы сделаете это один раз, то это не причинит вам особого вреда, но было бы неправильно регулярно практиковаться в этом.
Скотт Барта

1
Я полагаю, что <application>в проекте повторяется тег. Просьба убедиться, что есть только один <application>.
Пантера

В проекте может быть много тегов <application>, особенно если вы используете любое количество библиотечных подмодулей.
Агроснер

У меня есть примеры случаев, когда это работает просто отлично. Какую версию инструментов сборки Android вы используете?
Г. Блейк Майке

Вы добавили xmlns: tools = " schemas.android.com/tools " в тег манифеста? tools.android.com/tech-docs/new-build-system/user-guide/…
TouchBoarder

Ответы:


233

Объявите свой заголовок манифеста, как это

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

Затем вы можете добавить в свой тег приложения следующий атрибут:

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

Например, мне нужно заменить значок и метку. Удачи!


1
Как вы справляетесь с Android: имя с метаданными? android: name = "com.orm.SugarApp"> <метаданные android: name = "DATABASE" android: value = "sv_logs.db" /> <метаданные android: name = "VERSION" android: value = " 3 "/> <meta-data android: name =" QUERY_LOG "android: value =" true "/> <meta-data android: name =" DOMAIN_PACKAGE_NAME "android: value =" com.example.app "/>
Алан

@Alan Просто замените весь тег метаданных на tools:node="replace": <meta-data tools:node="replace" android:name="QUERY_LOG" android:value="true" />и т. Д.
Blacklight

25
Я запутался. Разве это не то, что он делает в своем вопросе?
Джейсон Робинсон

Я добавил tools:replaceв свое приложение тег, который должен заменить его, а не источник, который должен быть заменен. Таким образом, мои приложения заменяют то, что определено в моей библиотеке. Вы говорите «что следует заменить» вместо «что можно заменить». Я надеюсь, что это проясняет вопросы.
WarrenFaith

1
Если замененный атрибут находится в теге manifest, он tools:replace="android:versionCode, android:versionName"должен быть внутри <manifest >тега.
Иван Чау

42

Я исправил ту же проблему. Решение для меня:

  1. добавить xmlns:tools="http://schemas.android.com/tools"строку в тег манифеста
  2. добавить tools:replace=..в манифест тег
  3. переместить android:label=...в манифест тег

Пример:

 <?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
Спасибо за это, единственное, что устранило мою проблему , - добавление его <manifest>непосредственно, а не под <application>.
А. Сокол

1
Я не работал для меня, я должен поставить инструменты: replace = "android: allowBackup, android: label" или просто tools: replace = "allowBackup, label".
jmarkstar

1
Вы уверены, что это работает? Потому что для меня, похоже, вы пишете allowBackup не в том месте, и после слияния преобладает то, что указано в его манифесте Библиотекой. У вас нет конфликта после его перемещения сверху, потому что вы просто делаете это неправильно ( developer.android.com/guide/topics/manifest/… ) AllowBackup принадлежит элементу Application.
Райнхерд

2
[... продолжает сверху] ЭТО НЕ РАБОТАЕТ. Вы пишете allowBackup не в том месте, и после слияния преобладает то, что указано в его манифесте Библиотекой. У вас нет конфликта после его перемещения сверху, потому что вы просто делаете это неправильно ( developer.android.com/guide/topics/manifest/… ) AllowBackup принадлежит элементу Application. Я проверил это, декомпилировав APK, и последний манифест имел значение TRUE, а не FALSE, как я указал, как вы предложили
Reinherd

38

Попробуйте изменить порядок ваших зависимостей в файле Gradle. Мне пришлось переместить нарушающую библиотеку из нижней части списка вверх, и тогда это сработало.


Скажите мне, пожалуйста, одно средство: замените, если я добавлю это внутри тега приложения моего манифеста проекта или внутри тега приложения моей библиотеки. Скажите, пожалуйста, это будет очень полезно для меня?
Судханшу Гаур

@SudhanshuGaur Вам просто нужно добавить его в файл AndroidManifest.xml вашего проекта.
Кайл Лю

74
Это сработало. Но такие решения могут извлечь веру из человечества.
Винай Патил

8
# Андроид, такие как эти, делают разработку для Android довольно раздражающей
Тейлор Хэллидей,

1
Если у вас есть несколько разновидностей продукта, таких как play и non play, а зависимость - "playReleaseCompile ______", просто перемещение оператора в верхнюю часть может не сработать, возможно, вам придется изменить оператор на "compile ______", а затем переместить его в верхняя. Это должно работать тогда.
Сохам

33

Я только что испытал такое же поведение, tools:replace=...как описано в ОП.

Оказалось, что основной причиной tools:replaceигнорирования манифеста слияния является ошибка, описанная здесь . По сути, это означает, что если в вашем проекте есть библиотека, содержащая манифест с <application ...>узлом, содержащим tools:ignore=...атрибут, то может случиться, что tools:replace=...атрибут в манифесте вашего основного модуля будет проигнорирован.

Сложность в том, что это может случиться, но не обязательно. В моем случае у меня было две библиотеки: библиотека A с tools:ignore=...атрибутом, библиотека B с атрибутами, подлежащими замене в соответствующих манифестах, и tools:replace=...атрибут в манифесте основного модуля. Если манифест B был объединен с основным манифестом до манифеста A, все работало как ожидалось. В обратном порядке слияния появилась ошибка.

Порядок, в котором происходят эти слияния, кажется несколько случайным. В моем случае изменение порядка в разделе зависимостей не build.gradleимело никакого эффекта, но изменение имени флейвора сделало это.

Таким образом, единственный надежный обходной путь, по-видимому, состоит в распаковке библиотеки, вызывающей проблему, удалении tools:ignore=...тега (что не должно быть проблемой, поскольку это только подсказка для lint) и повторной упаковки библиотеки.

И голосуйте за исправление ошибки, причины.


В моем случае мне пришлось удалить инструменты: игнорировать из моего проекта, а не из одной из библиотек
mohax

3
Это было также моей проблемой. Перемещены инструменты: игнорируем <manifest>узел с <application>узла и все заработало.
Джейкоб Табак

Только что столкнулся с той же проблемой с Bazel v2.0.0 подал ошибку здесь github.com/bazelbuild/bazel/issues/10543
Ник Коростелев

18

Окончательное рабочее решение для меня (выделены метки в примере кода):

  1. добавить xmlns:toolsстроку в тег манифеста
  2. добавить tools:replaceв тег приложения

Пример:

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

Недостающий кусок для меня был такой:

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

например:

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

Можете ли вы поделиться своим кодом в точности так, как он есть в <manifest ...>?
Партизан

8

Вы можете заменить их в своем теге приложения Manifest:

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

и будет работать на вас.


По какой-то причине это не работает .... Я пытаюсь добавить tools:replace="android:label"в приложение, но это не работает
iKK

4

FIXED IT HAD ТОЧНОЙ ОШИБКИ, Просто добавьте эти инструменты: заменить = «андроид: значок, андроид: тему»

в тег приложения в вашем манифесте, он работает просто отлично,


это нормальная вещь то, о чем идет речь, не является нормальным поведением, которое происходит в некоторых случаях, когда даже инструменты: замена добавлена.
Дэвид

4

Вы можете заменить их в своем applicationтеге Manifest :

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

и будет работать на вас.

объяснение

Использование такой зависимости / библиотеки в вашем gradleфайле, которая имеет эти метки в теге приложения манифеста, может создать эту проблему, и замена их в вашем Manifestявляется решением.


1

Следующий хак работает:

  1. добавить xmlns:tools="http://schemas.android.com/tools"строку в тег манифеста
  2. добавить tools:replace="android:icon,android:theme,android:allowBackup,label" в тег приложения

1

Моя проблема заключается в многомодульном проекте с базовым модулем, модулем приложения и функциональным модулем. У каждого модуля есть свой AndroidManifest, и я реализовал вариант сборки для отладки и main. Поэтому мы должны убедиться, что «android: name» только что объявлено в Manifest только для отладки и main, и не устанавливать его ни в одном из Manifest в дочернем модуле. Пример: Манифест в основном:

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

Манифест в отладке:

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

Не устанавливайте «android: name» в других файлах манифеста, как это:

<application android:name=".App">

Просто определите в функциональном модуле, как это, и он будет хорошо слит

<application> 

0

Я получал похожую ошибку в проекте, который я импортировал:

Несколько записей с одним и тем же ключом: android: icon = ЗАМЕНА и инструменты: icon = ЗАМЕНА

Исправлено после изменения строки ниже в теге приложения:

tools:replace="icon, label, theme"

в

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

0

Я также прошел через эту проблему и изменил это:

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

в

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.