Zarządzaj plikami manifestu

Na tej stronie opisujemy, jak działa scalanie plików manifestu i jak to zrobić ustawienia na rozwiązywać konflikty scalania. Wprowadzenie do aplikacji pliku manifestu, zobacz opisie pliku manifestu aplikacji.

Scalanie wielu plików manifestu

Plik APK lub pakiet Android App Bundle może zawierać tylko jeden AndroidManifest.xml, ale projekt Android Studio może zawierać kilka plików manifestu udostępnionych przez główny zbiór źródłowy, warianty kompilacji i zaimportowane biblioteki. Kompilacja Gradle jest scalona podczas tworzenia aplikacji wszystkie pliki manifestu w jeden spakowany plik manifestu do aplikacji.

Narzędzie do łączenia plików manifestu łączy wszystkie elementy XML z każdego pliku w następujący sposób: scalanie heurystyki i stosowanie się do zdefiniowanych przez siebie preferencji scalania ze specjalnymi atrybutami XML.

Wskazówka: użyj pliku manifestu scalonego widoku danych, jak opisano w następnej sekcji, aby wyświetlić podgląd wyników scalonego pliku manifestu i znaleźć konflikty .

Scal priorytety

Narzędzie do łączenia danych łączy wszystkie pliki manifestu w jeden plik sekwencyjnie zgodnie z priorytetem każdego pliku manifestu. Jeśli na przykład masz 3 plików manifestu, plik manifestu o najniższym priorytecie jest scalony z plikiem plik manifestu o następnym najwyższym priorytecie, który jest następnie scalany z plikiem manifestu o najwyższym priorytecie. pliku manifestu, jak pokazano na rys. 1.

Rysunek 1. Proces łączenia 3 plików manifestu od najniższego do najwyższego priorytetu.

Istnieją 3 podstawowe typy plików manifestu, które można scalać w każdy z nich a ich priorytety scalania są następujące (najpierw o najwyższym priorytecie):

  1. Plik manifestu dla utwórz wariant

    Jeśli dla wariantu masz kilka zbiorów źródłowych, ich wartości w pliku manifestu są następujące priorytety:

    • Plik manifestu wariantu kompilacji (np. src/demoDebug/)
    • Plik manifestu typu kompilacji (np. src/debug/)
    • Plik manifestu rodzaju produktu (np. src/demo/)

      Jeśli używasz wymiarów dotyczących rodzajów, priorytety w pliku manifestu w kolejności, w której każdy wymiar jest wymieniony w tabeli Właściwość flavorDimensions (pierwsza ma najwyższy priorytet).

  2. Główny plik manifestu modułu aplikacji
  3. Plik manifestu z uwzględnionej biblioteki

    Jeśli masz wiele bibliotek, ich priorytety w pliku manifestu są takie same w kolejności, w jakiej są wyświetlane w Gradle Blok dependencies.

Na przykład plik manifestu biblioteki został scalony z głównym plikiem manifestu, a potem plik główny plik manifestu został scalony z plikiem manifestu wariantu kompilacji. Pamiętaj, że są to te same wartości. priorytety scalania dla wszystkich zbiorów źródłowych, tak jak to opisano w Twórz z użyciem zbiorów źródłowych.

Ważne: konfiguracje kompilacji z build.gradle zastępują wszystkie odpowiadające im atrybuty w scalonego pliku manifestu. Na przykład minSdk z build.gradle lub build.gradle.kts zastępuje pasujący atrybut w <uses-sdk>. manifestu. Aby uniknąć nieporozumień, pomiń <uses-sdk> i zdefiniuj te właściwości tylko w tagu build.gradle. Więcej informacji: Skonfiguruj kompilację.

Scal heurystykę konfliktów

Narzędzie do łączenia danych może logicznie dopasować każdy element XML, od jednego pliku manifestu do odpowiadającego mu elementu w innym pliku manifestu. Szczegółowe informacje na temat sposobu dopasowywania zapoznaj się z priorytetami scalania w poprzedniej sekcji.

Jeśli element z pliku manifestu o niższym priorytecie nie pasuje do żadnego elementu w pliku manifestu o wyższym priorytecie, zostanie on dodany do scalonego pliku manifestu. Pamiętaj jednak: gdy istnieje pasujący element, narzędzie do łączenia wszystkich atrybutów z każdego z nich w ten sam element. Jeśli narzędzie wykryje, że pliki manifestu zawierają ten sam atrybut z różnymi wartościami, po czym następuje scalenie konflikt danych.

Tabela 1 przedstawia możliwe rezultaty, jakie może wystąpić po połączeniu przez narzędzie do łączenia danych. wszystkie atrybuty w jeden element.

Tabela 1. Domyślne działanie scalania atrybutów wartości

Atrybut o wysokim priorytecie Atrybut niskiego priorytetu Wynik scalonego atrybutu
Nieistotna Nieistotna Brak wartości (użyj wartości domyślnej)
Wartość B Wartość B
Wartość A Nieistotna Wartość A
Wartość A Wartość A
Wartość B Błąd konfliktu – musisz dodać parametr znacznika reguły scalania.

W kilku sytuacjach narzędzie do łączenia danych działa jednak inaczej. aby uniknąć konfliktów podczas scalania:

  • Atrybuty w elemencie <manifest> nigdy nie są scalane razem; używane są tylko atrybuty z pliku manifestu o najwyższym priorytecie.
  • Atrybut android:required w <uses-feature> i Elementy <uses-library> używają lub scalenie LUB. Jeśli wystąpi konflikt, "true" jest a funkcja lub biblioteka wymagana przez jeden plik manifestu jest zawsze uwzględniana.
  • Atrybuty w Element <uses-sdk> zawsze używa wartości z parametru plik manifestu o wyższym priorytecie. Wyjątkiem są te sytuacje:
    • Gdy plik manifestu o niższym priorytecie zawiera wartość minSdk tej wyższej wartości, występuje błąd, chyba że zastosuj overrideLibrary reguła scalania.
    • Gdy plik manifestu o niższym priorytecie zawiera pole targetSdkVersion o niższej wartości, narzędzie do scalania użyje wartości z pliku manifestu o wyższym priorytecie, a także dodaje wszelkie uprawnienia systemowe które są niezbędne, aby mieć pewność, że importowana biblioteka działają prawidłowo (w przypadkach, gdy wyższa wersja Androida zwiększonych ograniczeń dotyczących uprawnień). Więcej informacji na ten temat zapoznaj się z sekcją o układzie niejawnym .
  • Element <intent-filter> nigdy nie pasuje do: plików manifestu. Każdy element jest traktowany jako niepowtarzalny i dodano do wspólnego elementu nadrzędnego w scalonym pliku manifestu.

W przypadku wszystkich innych konfliktów między atrybutami pojawia się błąd i konieczne jest wskaże narzędzie do łączenia danych, jak rozwiązać ten problem, dodając specjalny atrybut w plik manifestu o wyższym priorytecie. Zobacz następującą sekcję na temat: znaczniki reguł scalania.

Nie polegaj na domyślnych wartościach atrybutów. Ponieważ wszystkie unikalne atrybuty są łączone w ten sam element, może to spowodować, zawiera nieoczekiwane wyniki, jeśli plik manifestu o wyższym priorytecie naprawdę zależy od domyślną wartość atrybutu bez jego zadeklarowania. Na przykład, jeśli wyższy- Plik manifestu priorytetu nie deklaruje pola android:launchMode , to użyjemy domyślnej wartości "standard" – ale jeśli w pliku manifestu o niższym priorytecie deklaruje on ten atrybut z inną wartością, jest stosowana do scalonego pliku manifestu, co zastępuje wartość domyślną. Ty powinien bezpośrednio definiować każdy atrybut zgodnie z potrzebami. Wartości domyślne dla każdego atrybutu są udokumentowane w manifestu reference.

Scal znaczniki reguł

Znacznik reguły scalania to atrybut XML, którego możesz użyć do określenia własnych preferencji. jak rozwiązywać konflikty scalania lub usuwać niechciane elementy i atrybuty. Znacznik można zastosować do całego elementu lub tylko do konkretnego elementu w elemencie.

Jeśli scalasz dwa pliki manifestu, narzędzie do scalania wyszukuje te znaczniki w plik manifestu o wyższym priorytecie.

Wszystkie znaczniki należą do przestrzeni nazw Androida tools, dlatego najpierw musisz zadeklarować tę przestrzeń nazw w elemencie <manifest>, jak pokazano tutaj:

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

Znaczniki węzłów

Aby zastosować regułę scalania do całego elementu XML (do wszystkich atrybutów w danym manifestu i wszystkich jego tagów podrzędnych), użyj następującego tagu atrybuty:

tools:node="merge"
Scal wszystkie atrybuty w tym tagu i wszystkie zagnieżdżone elementy, jeśli występują brak konfliktów przy użyciu scalania heurystyki konfliktów. Jest to domyślne działanie elementów.

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge">
</activity>

Wynik scalonego pliku manifestu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
tools:node="merge-only-attributes"
Scal tylko atrybuty w tym tagu; nie scalaj zagnieżdżonych elementów.

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <data android:type="image/*" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="merge-only-attributes">
</activity>

Wynik scalonego pliku manifestu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
</activity>
tools:node="remove"
Usuń ten element ze scalonego pliku manifestu. Używana, gdy w scalonym pliku manifestu widzisz element, który nie jest Ci potrzebny. została udostępniona w pliku manifestu o niższym priorytecie, na który nie masz kontroli (np. zaimportowanej biblioteki).

Plik manifestu niskiego priorytetu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

Plik manifestu o wysokim priorytecie:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      tools:node="remove"/>
</activity-alias>

Wynik scalonego pliku manifestu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>
tools:node="removeAll"
Podobne do tools:node="remove", ale usuwa wszystkie elementów pasujących do tego typu elementu (w obrębie tego samego elementu nadrzędnego).

Plik manifestu niskiego priorytetu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

Plik manifestu o wysokim priorytecie:

<activity-alias android:name="com.example.alias">
  <meta-data tools:node="removeAll"/>
</activity-alias>

Wynik scalonego pliku manifestu:

<activity-alias android:name="com.example.alias">
</activity-alias>
tools:node="replace"
Zastąp całkowicie element o niższym priorytecie. Oznacza to, że jest pasującym elementem w pliku manifestu o niższym priorytecie, zignoruj go i użyj dokładnie w takiej postaci, w jakiej występuje w tym pliku manifestu.

Plik manifestu niskiego priorytetu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="cow"
      android:value="@string/moo"/>
  <meta-data android:name="duck"
      android:value="@string/quack"/>
</activity-alias>

Plik manifestu o wysokim priorytecie:

<activity-alias android:name="com.example.alias"
    tools:node="replace">
  <meta-data android:name="fox"
      android:value="@string/dingeringeding"/>
</activity-alias>

Wynik scalonego pliku manifestu:

<activity-alias android:name="com.example.alias">
  <meta-data android:name="fox"
      android:value="@string/dingeringeding"/>
</activity-alias>
tools:node="strict"
Generuj błąd kompilacji za każdym razem, gdy ten element o niższym priorytecie plik manifestu nie jest dokładnie zgodny z elementem w pliku manifestu o wyższym priorytecie (chyba że rozstrzygnięte przez inne znaczniki reguł scalania). Zastępuje to heurystykę konfliktów scalania. Dla: Jeśli na przykład plik manifestu o niższym priorytecie zawiera dodatkowy atrybut, kompilacja się nie uda (gdy domyślne działanie powoduje dodanie dodatkowego atrybutu do pliku manifestu scalonego).

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:node="strict">
</activity>

Spowoduje to utworzenie błędu scalania pliku manifestu. Dwa elementy manifestu nie mogą się zupełnie różnić w trybie ścisłym. Musisz zastosować inne znaczniki reguł scalania żeby zniwelować te różnice. (Bez tools:node="strict" te dwa pliki można scalić bez błędów, jak w przykładzie dla argumentu tools:node="merge").

Znaczniki atrybutów

Aby zamiast tego zastosować regułę scalania tylko do określonych atrybutów w pliku manifestu, użyj . Każdy atrybut może mieć co najmniej jedną nazwę atrybutu (łącznie z przestrzeni nazw atrybutów), rozdzielone przecinkami.

tools:remove="attr, ..."
Usuń określone atrybuty ze scalonego pliku manifestu. Używana, gdy plik manifestu o niższym priorytecie zawiera te i chcesz mieć pewność, że nie zostaną scalone. pliku manifestu.

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:windowSoftInputMode="stateUnchanged">

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:remove="android:windowSoftInputMode">

Wynik scalonego pliku manifestu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait">
tools:replace="attr, ..."
Zastąp określone atrybuty w pliku manifestu o niższym priorytecie tych z tego pliku manifestu. Innymi słowy, pamiętaj, aby zawsze z wartości pliku manifestu o wyższym priorytecie.

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:windowSoftInputMode="stateUnchanged">

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    tools:replace="android:theme,android:exported">

Wynik scalonego pliku manifestu:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    android:windowSoftInputMode="stateUnchanged">
tools:strict="attr, ..."
Wystąpił błąd kompilacji za każdym razem, gdy te atrybuty w pliku plik manifestu o niższym priorytecie nie pasuje dokładnie do atrybutów w wyższym priorytecie pliku manifestu. Jest to domyślne działanie w przypadku wszystkich atrybutów z wyjątkiem osób o specjalnych zachowaniach opisanych w artykule heurystyki scalania konfliktów.

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="landscape">
</activity>

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:screenOrientation="portrait"
    tools:strict="android:screenOrientation">
</activity>

Spowoduje to utworzenie błędu scalania pliku manifestu. Musisz zastosować inną regułę scalania znacznikami w celu rozwiązania konfliktu. Jest to działanie domyślne, więc ten sam wynik występuje przy jawnym dodaniu tools:strict="screenOrientation"

Do jednego elementu możesz też zastosować wiele znaczników, jak w tym przykładzie:

Plik manifestu niskiego priorytetu:

<activity android:name="com.example.ActivityOne"
    android:theme="@oldtheme"
    android:exported="false"
    android:allowTaskReparenting="true"
    android:windowSoftInputMode="stateUnchanged">

Plik manifestu o wysokim priorytecie:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:screenOrientation="portrait"
    tools:replace="android:theme,android:exported"
    tools:remove="android:windowSoftInputMode">

Wynik scalonego pliku manifestu:

<activity android:name="com.example.ActivityOne"
    android:theme="@newtheme"
    android:exported="true"
    android:allowTaskReparenting="true"
    android:screenOrientation="portrait">

Selektor znaczników

Jeśli chcesz zastosować znaczniki reguł scalania tylko do zaimportowanej biblioteki, dodaj atrybut tools:selector z nazwę pakietu biblioteki.

Na przykład w tym pliku manifestu remove reguła scalania jest stosowana tylko wtedy, gdy plik manifestu o niższym priorytecie pochodzi z Biblioteka com.example.lib1:

<permission android:name="permissionOne"
    tools:node="remove"
    tools:selector="com.example.lib1">

Jeśli plik manifestu o niższym priorytecie pochodzi z dowolnego innego źródła, remove reguła scalania jest ignorowana.

Uwaga: jeśli używasz tego atrybutu z jednym ze znaczników atrybutów, dotyczy to wszystkich atrybutów określonych w znaczniku.

Zastąp <uses-sdk> dla zaimportowanych bibliotek

Domyślnie podczas importowania biblioteki z wartością minSdk jest wyższy niż w głównym pliku manifestu, pojawia się błąd i Nie można zaimportować biblioteki.

Aby narzędzie do łączenia kont zignoruj ten konflikt, zaimportuj bibliotekę, zachowując w aplikacji krótszy minSdk dodaj atrybut overrideLibrary do tagu <uses-sdk>. Wartością atrybutu może być co najmniej jedna nazwa pakietu biblioteki (rozdzielone przecinkami), wskazujące biblioteki, które mogą zastąpić bibliotekę główną minSdk w pliku manifestu.

Jeśli na przykład główny plik manifestu aplikacji dotyczy pliku overrideLibrary podobny do tego:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.app"
          xmlns:tools="http://schemas.android.com/tools">
  <uses-sdk tools:overrideLibrary="com.example.lib1, com.example.lib2"/>
...

Potem będzie można scalić ten plik manifestu bez błędu dotyczącego <uses-sdk>, a scalony plik manifestu zachowuje minSdk="2" z manifestu aplikacji.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.lib1">
   <uses-sdk android:minSdk="4" />
...

Pośrednie uprawnienia systemowe

Niektóre interfejsy API Androida, które kiedyś były swobodnie dostępne dla aplikacji, stały się ograniczone przez uprawnienia systemowe w najnowszych wersji Androida.

Aby uniknąć uszkodzenia aplikacji, które oczekują do nich dostępu API, ostatnie wersje Androida umożliwiają aplikacjom dalszy dostęp do tych interfejsów. bez tego uprawnienia, jeśli targetSdkVersion ma wartość niższą niż w wersji, do której dodano ograniczenie. To zachowanie przyznaje aplikacji niejawne uprawnienia dostępu do interfejsów API. Scalony pliki manifestu z różnymi wartościami Może to mieć wpływ na: targetSdkVersion.

Jeśli plik manifestu o niższym priorytecie ma niższą wartość dla: targetSdkVersion, które przyzna mu uprawnienie niejawne, a plik manifestu o wyższym priorytecie nie ma takiego samego (ponieważ jego targetSdkVersion jest równy lub większy niż w wersji, w której dodano ograniczenie), narzędzie do łączenia jawnie dodaje uprawnienia systemowe do scalonego pliku manifestu.

Jeśli na przykład Twoja aplikacja ustawi targetSdkVersion na 4 lub wyższą i zaimportuje z biblioteką z wartością targetSdkVersion ustawioną na 3 lub mniejszą, narzędzie do łączenia WRITE_EXTERNAL_STORAGE. uprawnienia do scalonego pliku manifestu.

Tabela 2 zawiera wszystkie możliwe uprawnienia które można dodać do scalonego pliku manifestu:

Tabela 2. Lista uprawnień narzędzia do łączenia kont można dodać do scalonego pliku manifestu

Deklaracje w pliku manifestu o niższym priorytecie Dodano uprawnienia do scalonego pliku manifestu
targetSdkVersion ma wartość 3 lub niższą WRITE_EXTERNAL_STORAGE, READ_PHONE_STATE
targetSdkVersion ma co najmniej 15 lat i korzysta z konta READ_CONTACTS READ_CALL_LOG
targetSdkVersion ma co najmniej 15 lat i korzysta z konta WRITE_CONTACTS WRITE_CALL_LOG

Sprawdzanie scalonego pliku manifestu i znajdowanie konfliktów

Jeszcze przed utworzeniem aplikacji możesz wyświetlić podgląd elementów, które zostały scalone plik manifestu. Aby wyświetlić podgląd:

  1. W Android Studio otwórz plik AndroidManifest.xml.
  2. U dołu edytora kliknij kartę Plik manifestu scalonego.

Widok pliku manifestu scalonego zawiera po lewej stronie wyniki scalonego pliku manifestu. i informacje o każdym scalonym pliku manifestu z prawej strony, jak pokazano na rys. 2.

Elementy, które zostały scalone z plików manifestu o niższym priorytecie są wyróżnione różnymi kolorami po lewej stronie. Kluczem każdego koloru jest określona w sekcji Źródła pliku manifestu.

Rysunek 2. Widok scalonego pliku manifestu.

pliki manifestu, które były częścią kompilacji, ale nie zawierały elementów lub są wymienione w sekcji Inne pliki manifestu.

Aby zobaczyć informacje o tym, skąd pochodzi element, kliknij go po lewej stronie a szczegóły pojawią się w sekcji Dziennik łączenia.

Jeśli wystąpią konflikty, pojawią się one w sekcji Błędy łączenia. ze wskazówkami dotyczącymi rozwiązywania konfliktów za pomocą znaczniki reguł scalania

Błędy są też drukowane w oknie Dziennik zdarzeń. Aby je wyświetlić, wybierz Widok > Okna narzędziowe > Dziennik zdarzeń.

Pełny log drzewa decyzyjnego o scalaniu znajdziesz znajduje się w katalogu build/outputs/logs/ modułu o nazwie manifest-merger-buildVariant-report.txt

Scal zasady

Narzędzie do łączenia plików manifestu może logicznie dopasować każdy element XML z jednego pliku manifestu do odpowiedniego elementu w innym pliku. Scalenie odpowiada każdemu elementowi używając klucza dopasowania, czyli niepowtarzalnej wartości atrybutu (np. android:name) lub Niepowtarzalność samego tagu (np. może zawierać tylko jeden tag <supports-screen>).

Jeśli 2 pliki manifestu zawierają ten sam element XML: narzędzie łączy oba elementy przy użyciu jednej z trzech zasad scalania:

Scal
Połącz wszystkie atrybuty niekolidujące w jednym tagu i scal elementów podrzędnych zgodnie z odpowiednimi zasadami scalania. Jeśli jakiekolwiek atrybuty kolidują ze sobą, scal je przy użyciu znaczników reguł scalania
Scal tylko podrzędne
Nie łącz ani nie scalaj atrybutów (zachowaj tylko podane atrybuty pliku manifestu o najwyższym priorytecie) i scal elementów podrzędnych zgodnie z ich zasadami scalania.
Keep
Pozostaw element w niezmienionej formie i dodaj go do wspólnego elementu nadrzędnego w polu scalony plik. Jest on używany tylko wtedy, gdy akceptowalne jest kilka tego samego elementu.

Tabela 3 zawiera listę wszystkich typów elementów, typów użytych zasad scalania oraz klucz używany do określania dopasowania elementu między 2 plikami manifestu:

Tabela 3. zasady scalania elementów manifestu; klucze dopasowania

Żywioły Zasada scalania Klucz dopasowania
<action> Scal android:name atrybut
<activity> Scal android:name atrybut
<application> Scal Obowiązuje tylko 1 na <manifest>.
<category> Scal android:name atrybut
<data> Scal Obowiązuje tylko 1 na <intent-filter>.
<grant-uri-permission> Scal Obowiązuje tylko 1 na <provider>.
<instrumentation> Scal android:name atrybut
<intent-filter> Keep Brak dopasowań; w elemencie nadrzędnym można umieścić kilka deklaracji.
<manifest> Scal tylko podrzędne W każdym pliku jest tylko 1 plik.
<meta-data> Scal android:name atrybut
<path-permission> Scal Obowiązuje tylko 1 na <provider>.
<permission-group> Scal android:name atrybut
<permission> Scal android:name atrybut
<permission-tree> Scal android:name atrybut
<provider> Scal android:name atrybut
<receiver> Scal android:name atrybut
<screen> Scal android:screenSize atrybut
<service> Scal android:name atrybut
<supports-gl-texture> Scal android:name atrybut
<supports-screen> Scal Obowiązuje tylko 1 na <manifest>.
<uses-configuration> Scal Obowiązuje tylko 1 na <manifest>.
<uses-feature> Scal android:name (jeśli go nie ma, używany jest atrybut android:glEsVersion)
<uses-library> Scal android:name atrybut
<uses-permission> Scal android:name atrybut
<uses-sdk> Scal Obowiązuje tylko 1 na <manifest>.
Elementy niestandardowe Scal Brak dopasowań; narzędzia do łączenia kont nie mają dostępu do informacji na ich temat, zawarte w scalonym pliku manifestu.

Wstrzyknij zmienne kompilacji do pliku manifestu

Jeśli chcesz wstawić do pliku AndroidManifest.xml zmienne, które: zdefiniowane w pliku build.gradle, możesz to zrobić za pomocą funkcji Usługa manifestPlaceholders. Ta właściwość pobiera mapę par klucz-wartość, jak tutaj:

Odlotowe

android {
    defaultConfig {
        manifestPlaceholders = [hostName:"www.example.com"]
    }
    ...
}

Kotlin

android {
    defaultConfig {
        manifestPlaceholders["hostName"] = "www.example.com"
    }
    ...
}

Następnie możesz wstawić jedną z tych zmiennych do pliku manifestu jako wartość atrybutu:

<intent-filter ... >
    <data android:scheme="https" android:host="${hostName}" ... />
    ...
</intent-filter>

Domyślnie narzędzia do kompilacji udostępniają też identyfikator aplikacji w zmiennej ${applicationId}. Wartość zawsze pasuje do ostatecznej identyfikator aplikacji w bieżącej kompilacji, w tym za pomocą wariantów kompilacji. Jest to przydatne, gdy chcesz użyć unikalnej przestrzeni nazw dla identyfikatorów np. działanie intencji, nawet pomiędzy wariantami kompilacji.

Jeśli na przykład plik build.gradle wygląda tak:

Odlotowe

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    flavorDimensions "type"
    productFlavors {
        free {
            applicationIdSuffix ".free"
            dimension "type"
        }
        pro {
            applicationIdSuffix ".pro"
            dimension "type"
        }
    }
}

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"
    }
    flavorDimensions += "type"
    productFlavors {
        create("free") {
            applicationIdSuffix = ".free"
            dimension = "type"
        }
        create("pro") {
            applicationIdSuffix = ".pro"
            dimension = "type"
        }
    }
}

Następnie możesz wstawić identyfikator aplikacji w pliku manifestu w następujący sposób:

<intent-filter ... >
    <action android:name="${applicationId}.TRANSMOGRIFY" />
    ...
</intent-filter>

W pliku manifestu pojawi się po utworzeniu „bezpłatnej” smak produktu jest taki:

<intent-filter ... >
   <action android:name="com.example.myapp.free.TRANSMOGRIFY" />
    ...
</intent-filter>

Więcej informacji: Ustaw identyfikator aplikacji.