Інструменти: замінити не замінюючи в маніфесті 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 ви використовуєте?
G. Blake Meike

ви додали 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: name з метаданими? android: name = "com.orm.SugarApp"> <метаданих android: name = "DATABASE" android: value = "sv_logs.db" /> <метаданих android: name = "VERSION" android: value = " 3 "/> <мета-дані android: name =" QUERY_LOG "android: value =" true "/> <мета-дані android: name =" DOMAIN_PACKAGE_NAME "android: value =" com.example.app "/>
Alan

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

25
Я збентежений. Чи не саме це він робить у своєму питанні?
Джейсон Робінсон

Я додав tools:replaceдо свого тегу програми, який повинен замінити його, а не джерело, яке слід замінити. Тож маніфести мого додатка замінюють те, що визначено в моїй бібліотеці. Ви кажете "що слід замінити" замість "те, що можна замінити". Я сподіваюся, що це очистить питання.
WarrenFaith

1
Якщо замінений атрибут знаходиться в тезі маніфесту, він 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
Я не працював для мене, я повинен поставити інструменти: substitu = = "android: enableBackup, android: label", а також не лише інструменти: substitu = = "enableBackup, label".
jmarkstar

1
Ви впевнені, що це працює? Тому що для мене виглядає так, що ви пишете enableBackup в неправильному місці, і що після злиття переважає те, що Бібліотека вказала на своєму маніфесті. У вас немає конфлікту після переміщення його зверху, тому що ви просто робите це неправильно ( developer.android.com/guide/topics/manifest/… ) AllowBackup належить до елемента Application.
Reinherd

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

38

Спробуйте впорядкувати свої залежності у вашому файлі gradle. Мені довелося перенести образотворчу бібліотеку знизу списку вгору, і тоді це спрацювало.


скажіть, будь ласка, одне з інструментів: замініть, чи слід додати цей тег додатка до маніфесту проекту чи всередині тегу програми моєї бібліотеки, будь ласка, скажіть, що це буде для мене дуже корисним ??
Sudhanshu Gaur

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

74
Це спрацювало. Але такі рішення можуть забрати віру у людства.
Vinay Patil

8
#android gotchas, як вони, роблять розробку для андроїда досить дратівливою
Тейлор Хеллідей,

1
Якщо у вас є кілька ароматів продуктів, таких як грати і не грати, а залежність - "playReleaseCompile ______", просто переміщення оператора вгору може не спрацювати, можливо, вам доведеться змінити оператор на "компілювати ______", а потім перемістити його на верх. Це має працювати тоді.
Сохам

33

Я просто пережив таку саму поведінку, tools:replace=...як описано в ОП.

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

Тут складний момент полягає в тому, що це може статися, але не обов’язково. У моєму випадку у мене були дві бібліотеки, бібліотека A з tools:ignore=...атрибутом, бібліотека B з атрибутами, які слід замінити у відповідних маніфестах, іtools:replace=... атрибут у маніфесті головного модуля. Якщо маніфест B був об'єднаний у головний маніфест перед маніфестом A, все працювало так, як очікувалося. У протилежному порядку злиття з’явилася помилка.

Порядок, в якому ці злиття відбуваються, здається дещо випадковим. У моєму випадку зміна порядку в розділі залежностіbuild.gradle не вплинула, але зміна назви аромату зробила це.

Отже, єдиним надійним вирішенням, як видається, є розпакування проблеми, що спричиняє бібліотеку, видалення tools:ignore=...тегу (що не повинно бути проблемою, оскільки це підказка лише на вказівки) та упаковка бібліотеки знову.

І голосувати за виправлення помилки, за причину.


У моєму випадку мені довелося видалити інструменти: ігнорувати з мого проекту, а не з однієї з бібліотек
mohax

3
Це також було моїм питанням. Перемістив інструменти: ігноруй до <manifest>вузла з <application>вузла, і він спрацював.
Яків Табак

Щойно зіткнувся з тією ж проблемою, що Bazel v2.0.0 подав помилку тут github.com/bazelbuild/bazel/isissue/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">

Чи можете ви поділитися своїм кодом саме з ним у <маніфесті ...>?
партизан

8

Ви можете замінити їх у тезі програми Manifest:

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

і працюватиме на вас.


Він не працює чомусь .... Я намагаюся додати tools:replace="android:label"до програми, але це не працює
iKK

4

ФІКСОВАНО ІТ ВІД ТЕХНІЧНОЇ ПОМИЛКИ, просто додайте ці інструменти: substitu = = "android: icon, android: topic"

в тег додатка у вашому маніфесті, він працює чудово,


це нормальна річ. Що стосується теми, це не нормальна поведінка трапляється в деяких випадках, коли навіть інструменти: замінити додані.
Девід

4

Ви можете замінити ці в applicationтезі Manifest :

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

і працюватиме на вас.

Пояснення

Використання такої залежності / бібліотеки у вашому gradleфайлі, яка має ці мітки у тезі додатку Manifest, може призвести до цієї проблеми, а заміна їх у вашому 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" в інших файлах Manifest, як це:

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